Docker(1)(docker18.09)

  本篇文章为你整理了Docker(1)(docker18.09)的详细内容,包含有docker19.03 docker18.09 docker1.13.1 docker19 Docker(1),希望能帮助你了解 Docker(1)。

  确保应用能够在这些环境中运行和通过质量检测.并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复.

  Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。

  解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

  一次构建、随处运行

  
更快速的应用交付和部署:

  传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

  
更便捷的升级和扩缩容:

  随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

  
更简单的系统运维:

  应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

  
更高效的计算资源利用:

  Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

  
docker官网:http://www.docker.com

  Docker Hub官网: https://hub.docker.com/

  Docker 的基本组成

  镜像(image)

  image 文件生成的容器实例,本身也是一个文件,称为镜像文件.

  
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

  
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。

  
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。

  
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器.

  
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

  
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

  
类似于Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

  
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

  
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

  image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

  镜像文件 image 文件生成的容器实例,本身也是一个文件,称为镜像文件.

  Docker 是一个Client-Server 结构的系统架构,Docker 守护进程运行在主机上,然后通过 Socker 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器,容器,是一个运行时环境,就是一个个集装箱.

  Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。

  Docker运行的基本流程:

  用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者.

  Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Clinet 的请求.

  Docker Daemon 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在.

  Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver 将下载镜像以 Graph 的形式存储.

  当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境.

  当需要限制 Docker 容器运行资源或执行用户指令等操作是,则通过 Exec driver 来完成.

  Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过Libcontainer 来实现具体对容器进行的操作.

  https://docs.docker.com/engine/install/centos/ 官网安装操作指南

  确认虚拟机版本是 CentOS7 及以上版本

  

[root@localhost ~]# cat /etc/redhat-release

 

  CentOS Linux release 7.9.2009 (Core)

  [root@localhost ~]# uname -r

  3.10.0-1160.59.1.el7.x86_64

  

 

  卸载旧版

  

yum list installed grep docker

 

  yum remove docker \

   docker-client \

   docker-client-latest \

   docker-common \

   docker-latest \

   docker-latest-logrotate \

   docker-logrotate \

   docker-engine

  

 

  安装 gcc 相关

  

[root@localhost ~]# yum -y install gcc

 

  [root@localhost ~]# yum -y install gcc-c++

  

 

  设置存储库

  官网推荐的是外网的地址,下载速度慢且会出现网络超时的问题.

  

[root@localhost ~]# yum install -y yum-utils

 

  [root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  

 

  建立元数据缓存

  

[root@localhost ~]# yum makecache fast

 

  

 

  安装 Docker

  

[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io

 

  

 

  启动 Docker

  

[root@localhost ~]# systemctl start docker

 

  

 

  运行 hello-world

  

[root@localhost ~]# docker run hello-world

 

  Hello from Docker!

  This message shows that your installation appears to be working correctly.

  To generate this message, Docker took the following steps:

   1. The Docker client contacted the Docker daemon.

   2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

   (amd64)

   3. The Docker daemon created a new container from that image which runs the

   executable that produces the output you are currently reading.

   4. The Docker daemon streamed that output to the Docker client, which sent it

   to your terminal.

  To try something more ambitious, you can run an Ubuntu container with:

   $ docker run -it ubuntu bash

  Share images, automate workflows, and more with a free Docker ID:

   https://hub.docker.com/

  For more examples and ideas, visit:

   https://docs.docker.com/get-started/

  

 

  修改镜像加速器

  https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

  

sudo mkdir -p /etc/docker

 

  sudo tee /etc/docker/daemon.json -EOF

   "registry-mirrors": ["自己的阿里云镜像加速地址"]

  sudo systemctl daemon-reload

  sudo systemctl restart docker

  

 

  run 干了什么

  帮助启动类

  启动: systemctl start docker

  停止: systemctl stop docker

  重启: systemctl restart docker

  查看状态: systemctl status docker

  开机启动: systemctl enable docker

  查看概要信息: docker info

  查看总体帮助文档: docker--help

  查看命令帮助文档: docker 具体命令 --help

  更新 docker 镜像的指令: docker update mysql --restart=always

  


[root@VM-0-12-centos docker]# docker images

 

  镜像仓库源 镜像的标签版本号 镜像ID 镜像创建时间 镜像大小

  REPOSITORY TAG IMAGE ID CREATED SIZE

  hello-world latest feb5d9fea6a5 9 months ago 13.3kB

  同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像.

  


[root@VM-0-12-centos docker]# docker search --limit 5 redis

 

  镜像名称 镜像说明 点赞数 是否官方 是否是自动构建的

  NAME DESCRIPTION STARS OFFICIAL AUTOMATED

  redis Redis is an open source key-value store that… 11064 [OK]

  bitnami/redis Bitnami Redis Docker Image 223 [OK]

  bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 38 [OK]

  circleci/redis CircleCI images for Redis 14 [OK]

  bitnami/redis-exporter

  

 

  docker pull 某个XXX镜像名字

  

docker pull 镜像名字[:TAG] 没有 TAG 就是最新版

 

  

 

  docker system df 查看镜像/容器/数据卷所占的空间

  

[root@VM-0-12-centos docker]# docker system df

 

  TYPE TOTAL ACTIVE SIZE RECLAIMABLE

  Images 1 1 13.26kB 0B (0%)

  Containers 1 0 0B 0B

  Local Volumes 0 0 0B 0B

  Build Cache 0 0 0B 0B

  

 

  docker rmi 某个XXX镜像名字ID

  
REPOSITORY TAG IMAGE ID CREATED SIZE

  hello-world latest feb5d9fea6a5 9 months ago 13.3kB

  [root@VM-0-12-centos docker]# docker rmi feb5d9fea6a5

  Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 17d8a49cb33f

  [root@VM-0-12-centos docker]# docker rmi -f feb5d9fea6a5

  Untagged: hello-world:latest

  Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f

  Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

  

 

  新建 + 启动容器

  docker run [OPTIONS] IMAGE [COMMAND] [ARG......]

  docker run --name mysql --memory=512m --restart=always -v /usr/local/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 33016:3306 -d mysql:5.7.38

  OPTIONS 说明

  
-t: 为容器重新分配一个伪输入终端, 通常与 -i 同时使用;

  也即启动交互式容器(前台有伪终端,等待交互);

  
ubuntu latest ba6acccedd29 8 months ago 72.8MB

  [root@VM-0-12-centos docker]# docker run -it ubuntu bash

  root@d40983ae61dd:/#

  

 

 

  列出当前所有正在运行的容器

  docker ps [OPTIONS]

  OPTIONS说明(常用):

  -a :列出当前所有正在运行的容器+历史上运行过的

  -l :显示最近创建的容器。

  -n:显示最近n个创建的容器。

  -q :静默模式,只显示容器编号。

  

[root@VM-0-12-centos /]# docker ps

 

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  00d1b3d76fee ubuntu "bash" 18 seconds ago Up 18 seconds competent_torvalds

  

 

  run 进去容器,exit 退出,容器停止

  ctrl+p+q

  run进去容器,

  启动以停止运行的容器

  docker start 容器ID或者容器名

  docker restart 容器ID或者容器名

  docker stop 容器ID或者容器名

  强制停止容器

  docker kill 容器ID或容器名

  删除已停止的容器

  docker rm 容器ID

  一次性删除多个容器实例

  docker rm -f $(docker ps -a -q)

  启动守护式容器(后台服务器)

  在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。

  docker run -d 容器名

  

[root@VM-0-12-centos /]# docker run -d redis

 

  07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9

  [root@VM-0-12-centos /]# docker ps

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  07ded90b56af redis "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 6379/tcp intelligent_meninsky

  00d1b3d76fee ubuntu "bash" 3 hours ago Up 3 hours competent_torvalds

  

 

  查看容器日志

  docker logs 容器ID

  

[root@VM-0-12-centos /]# docker logs 07ded90b56af

 

  1:C 23 Jun 2022 09:05:40.303 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

  1:C 23 Jun 2022 09:05:40.303 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started

  1:C 23 Jun 2022 09:05:40.303 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

  1:M 23 Jun 2022 09:05:40.304 * monotonic clock: POSIX clock_gettime

  1:M 23 Jun 2022 09:05:40.304 * Running mode=standalone, port=6379.

  1:M 23 Jun 2022 09:05:40.304 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

  1:M 23 Jun 2022 09:05:40.304 # Server initialized

  1:M 23 Jun 2022 09:05:40.304 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add vm.overcommit_memory = 1to /etc/sysctl.conf and then reboot or run the command sysctl vm.overcommit_memory=1 for this to take effect.

  1:M 23 Jun 2022 09:05:40.304 * Ready to accept connections

  

 

  查看容器内运行的进程

  docker top 容器ID

  

[root@VM-0-12-centos /]# docker top 07ded90b56af

 

  UID PID PPID C STIME TTY TIME CMD

  polkitd 31140 31120 0 17:05 ? 00:00:00 redis-server *:6379

  

 

  查看容器内部细节

  docker inspect 容器ID

  

[root@VM-0-12-centos /]# docker inspect 07ded90b56af

 

   "Id": "07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9",

   "Created": "2022-06-23T09:05:40.024477806Z",

   "Path": "docker-entrypoint.sh",

   "Args": [

   "redis-server"

   "State": {

   "Status": "running",

   "Running": true,

   "Paused": false,

   "Restarting": false,

   "OOMKilled": false,

   "Dead": false,

   "Pid": 31140,

   "ExitCode": 0,

   "Error": "",

   "StartedAt": "2022-06-23T09:05:40.289655512Z",

   "FinishedAt": "0001-01-01T00:00:00Z"

   "Image": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",

   "ResolvConfPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/resolv.conf",

   "HostnamePath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hostname",

   "HostsPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hosts",

   "LogPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9-json.log",

   "Name": "/intelligent_meninsky",

   "RestartCount": 0,

   "Driver": "overlay2",

   "Platform": "linux",

   "MountLabel": "",

   "ProcessLabel": "",

   "AppArmorProfile": "",

   "ExecIDs": null,

   "HostConfig": {

   "Binds": null,

   "ContainerIDFile": "",

   "LogConfig": {

   "Type": "json-file",

   "Config": {}

   "NetworkMode": "default",

   "PortBindings": {},

   "RestartPolicy": {

   "Name": "no",

   "MaximumRetryCount": 0

   "AutoRemove": false,

   "VolumeDriver": "",

   "VolumesFrom": null,

   "CapAdd": null,

   "CapDrop": null,

   "CgroupnsMode": "host",

   "Dns": [],

   "DnsOptions": [],

   "DnsSearch": [],

   "ExtraHosts": null,

   "GroupAdd": null,

   "IpcMode": "private",

   "Cgroup": "",

   "Links": null,

   "OomScoreAdj": 0,

   "PidMode": "",

   "Privileged": false,

   "PublishAllPorts": false,

   "ReadonlyRootfs": false,

   "SecurityOpt": null,

   "UTSMode": "",

   "UsernsMode": "",

   "ShmSize": 67108864,

   "Runtime": "runc",

   "ConsoleSize": [

   "Isolation": "",

   "CpuShares": 0,

   "Memory": 0,

   "NanoCpus": 0,

   "CgroupParent": "",

   "BlkioWeight": 0,

   "BlkioWeightDevice": [],

   "BlkioDeviceReadBps": null,

   "BlkioDeviceWriteBps": null,

   "BlkioDeviceReadIOps": null,

   "BlkioDeviceWriteIOps": null,

   "CpuPeriod": 0,

   "CpuQuota": 0,

   "CpuRealtimePeriod": 0,

   "CpuRealtimeRuntime": 0,

   "CpusetCpus": "",

   "CpusetMems": "",

   "Devices": [],

   "DeviceCgroupRules": null,

   "DeviceRequests": null,

   "KernelMemory": 0,

   "KernelMemoryTCP": 0,

   "MemoryReservation": 0,

   "MemorySwap": 0,

   "MemorySwappiness": null,

   "OomKillDisable": false,

   "PidsLimit": null,

   "Ulimits": null,

   "CpuCount": 0,

   "CpuPercent": 0,

   "IOMaximumIOps": 0,

   "IOMaximumBandwidth": 0,

   "MaskedPaths": [

   "/proc/asound",

   "/proc/acpi",

   "/proc/kcore",

   "/proc/keys",

   "/proc/latency_stats",

   "/proc/timer_list",

   "/proc/timer_stats",

   "/proc/sched_debug",

   "/proc/scsi",

   "/sys/firmware"

   "ReadonlyPaths": [

   "/proc/bus",

   "/proc/fs",

   "/proc/irq",

   "/proc/sys",

   "/proc/sysrq-trigger"

   "GraphDriver": {

   "Data": {

   "LowerDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255-init/diff:/var/lib/docker/overlay2/05a8a4f1851e58cedf41a415398bb5cf39a32e326456951e6cc8d4a673e73e05/diff:/var/lib/docker/overlay2/8469b8e50c809cf1dc6f9c63ffc1fc5dc128cd73c1f92aa41187ee93f8a3be67/diff:/var/lib/docker/overlay2/193be01a8240889e740be1723fa5888ecc59bc6587ccb98306549947ed8c6c40/diff:/var/lib/docker/overlay2/aeaecb8e4ce8a77e4f47b62510351e91a5219593f40937aa764fa09f339ee4f5/diff:/var/lib/docker/overlay2/c269d2f03c12c5ec91a847865cead78e8b5effed0e77b9ef40085275f2e77853/diff:/var/lib/docker/overlay2/3160e9a44ba0655bee0354c0c2b4c5c11fa43aff0f3a0ace5be92a0188bdcfb0/diff",

   "MergedDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/merged",

   "UpperDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/diff",

   "WorkDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/work"

   "Name": "overlay2"

   "Mounts": [

   "Type": "volume",

   "Name": "554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133",

   "Source": "/var/lib/docker/volumes/554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133/_data",

   "Destination": "/data",

   "Driver": "local",

   "Mode": "",

   "RW": true,

   "Propagation": ""

   "Config": {

   "Hostname": "07ded90b56af",

   "Domainname": "",

   "User": "",

   "AttachStdin": false,

   "AttachStdout": false,

   "AttachStderr": false,

   "ExposedPorts": {

   "6379/tcp": {}

   "Tty": false,

   "OpenStdin": false,

   "StdinOnce": false,

   "Env": [

   "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

   "GOSU_VERSION=1.12",

   "REDIS_VERSION=6.2.6",

   "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",

   "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"

   "Cmd": [

   "redis-server"

   "Image": "redis",

   "Volumes": {

   "/data": {}

   "WorkingDir": "/data",

   "Entrypoint": [

   "docker-entrypoint.sh"

   "OnBuild": null,

   "Labels": {}

   "NetworkSettings": {

   "Bridge": "",

   "SandboxID": "f57ab2e208029d1363f4a8d556a2839d0b7c4bfd055b953fb989e4adf499cb52",

   "HairpinMode": false,

   "LinkLocalIPv6Address": "",

   "LinkLocalIPv6PrefixLen": 0,

   "Ports": {

   "6379/tcp": null

   "SandboxKey": "/var/run/docker/netns/f57ab2e20802",

   "SecondaryIPAddresses": null,

   "SecondaryIPv6Addresses": null,

   "EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",

   "Gateway": "172.18.0.1",

   "GlobalIPv6Address": "",

   "GlobalIPv6PrefixLen": 0,

   "IPAddress": "172.18.0.3",

   "IPPrefixLen": 16,

   "IPv6Gateway": "",

   "MacAddress": "02:42:ac:12:00:03",

   "Networks": {

   "bridge": {

   "IPAMConfig": null,

   "Links": null,

   "Aliases": null,

   "NetworkID": "359b060a5722ca714f272fee7ec1b866f2f20ba1f27a244d393046c7cb19d10d",

   "EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",

   "Gateway": "172.18.0.1",

   "IPAddress": "172.18.0.3",

   "IPPrefixLen": 16,

   "IPv6Gateway": "",

   "GlobalIPv6Address": "",

   "GlobalIPv6PrefixLen": 0,

   "MacAddress": "02:42:ac:12:00:03",

   "DriverOpts": null

  

 

  进入正在运行的容器并以命令行交互

  docker exec -it 容器ID bashShell

  docker attach 容器ID

  上述两个区别

  attach 直接进入容器启动命令的终端,不会启动新的进程, 用exit退出,会导致容器的停止。

  exec 是在容器中打开新的终端,并且可以启动新的进程, 用exit退出,不会导致容器的停止。

  从容器内拷贝文件到主机上

  docker cp 容器ID:容器内路径 目的主机路径

  

[root@VM-0-12-centos docker]# ll

 

  total 0

  [root@VM-0-12-centos docker]# pwd

  /usr/local/docker

  [root@VM-0-12-centos docker]# docker ps

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  07ded90b56af redis "docker-entrypoint.s…" 35 minutes ago Up 35 minutes 6379/tcp intelligent_meninsky

  00d1b3d76fee ubuntu "bash" 3 hours ago Up 3 hours competent_torvalds

  [root@VM-0-12-centos docker]# docker cp 00d1b3d76fee:/tmp/a.txt /usr/local/docker/

  [root@VM-0-12-centos docker]# ll

  total 0

  -rw-r--r-- 1 root root 0 Jun 23 17:40 a.txt

  

 

  导入和导出容器

  export 导出容器的内容留作为一个tar归档文件[对应import命令]

  import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

  

[root@VM-0-12-centos docker]# docker export 00d1b3d76fee export.tar

 

  [root@VM-0-12-centos docker]# ll

  total 73400

  -rw-r--r-- 1 root root 0 Jun 23 17:40 a.txt

  -rw-r--r-- 1 root root 75159040 Jun 23 17:45 export.tar

  [root@VM-0-12-centos docker]# cat export.tar docker import - test/ubuntu:1.0

  sha256:6b48c540913df35a1daccfcdc14b56a04edc96f8ec5a0f84c8b6f48bcbb2b474

  [root@VM-0-12-centos docker]# docker images

  REPOSITORY TAG IMAGE ID CREATED SIZE

  test/ubuntu 1.0 6b48c540913d 16 seconds ago 72.8MB

  redis latest 7614ae9453d1 6 months ago 113MB

  ubuntu latest ba6acccedd29 8 months ago 72.8MB

  [root@VM-0-12-centos docker]# docker run -it 6b48c540913d bash

  root@ee539a48a5c6:/# cd /tmp/

  root@ee539a48a5c6:/tmp# ll

  total 8

  drwxrwxrwt 2 root root 4096 Jun 23 09:40 ./

  drwxr-xr-x 1 root root 4096 Jun 23 09:52 ../

  -rw-r--r-- 1 root root 0 Jun 23 09:40 a.txt

  

 

  Docker 镜像

  是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

  只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

  分层的镜像

  以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载.

  UnionFS

  Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

  docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

  rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

  平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

  对于一个精简的 OS, rootfs 可以很小, 只需要包括最基本的命令, 工具和程序库就可以了, 因为底层直接用 Host 的 kernel, 自己只需要提供 rootfs 就行了,.由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs.,

  为什么 Docker 镜像要采用这种分层结构呢?

  镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

  比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

  Docker 镜像层都是只读的, 容器层是可写的.

  当容器启动时, 一个新的可写层被加载到镜像的顶部. 这一层通常被称作 "容器层", "容器层" 之下都叫 "镜像层".

  所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

  镜像Commit操作

  docker commit 提交容器副本使之成为一个新的镜像

  docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

  ubuntu 安装 vim

  

root@ee539a48a5c6:/# vim a.txt

 

  bash: vim: command not found

  root@ee539a48a5c6:/tmp# apt-get update

  Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]

  Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]

  Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [881 kB]

  Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]

  Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]

  Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]

  Get:7 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [27.5 kB]

  Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1331 kB]

  Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]

  Get:10 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1979 kB]

  Get:11 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]

  Get:12 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]

  Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1411 kB]

  Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2420 kB]

  Get:15 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1161 kB]

  Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]

  Get:17 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [54.2 kB]

  Get:18 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.1 kB]

  Fetched 22.8 MB in 10s (2345 kB/s)

  Reading package lists... Done

  root@ee539a48a5c6:/tmp# apt-get -y install vim

  Reading package lists... Done

  Building dependency tree

  Reading state information... Done

  ......

  update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/vim.1.gz (of link group editor) doesnt exist

  Processing triggers for libc-bin (2.31-0ubuntu9.2) ...

  
test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB

  redis latest 7614ae9453d1 6 months ago 113MB

  ubuntu latest ba6acccedd29 8 months ago 72.8MB

  [root@VM-0-12-centos /]# docker commit -m="add vim cmd" -a="zzyy" ee539a48a5c6 test/myubuntu:1.1

  sha256:051bc4b8a6dc20c72f1224f077bdd3888b0ca725bebc26d9e6e5623a6cbadb6a

  [root@VM-0-12-centos /]# docker images

  REPOSITORY TAG IMAGE ID CREATED SIZE

  test/myubuntu 1.1 051bc4b8a6dc 15 seconds ago 178MB

  test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB

  redis latest 7614ae9453d1 6 months ago 113MB

  ubuntu latest ba6acccedd29 8 months ago 72.8MB

  

 

  镜像中多了一个 test/myubuntu 的镜像, 其大小有 178MB.

  启动新建的镜像后,其中自带了vim的功能.

  镜像发布到阿里云

  https://cr.console.aliyun.com/repository/cn-hangzhou/learn_docker_images/docker_images/details

  1. 登录阿里云Docker Registry

  

$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com

 

  

 

  用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

  您可以在访问凭证页面修改凭证密码。

  2. 从Registry中拉取镜像

  

$ docker pull registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]

 

  

 

  3. 将镜像推送到Registry

  

$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]

 

  

 

  请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

  4. 选择合适的镜像仓库地址

  从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

  如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

  5. 示例

  

[root@VM-0-12-centos /]# docker images

 

  REPOSITORY TAG IMAGE ID CREATED SIZE

  test/myubuntu 1.1 051bc4b8a6dc 15 seconds ago 178MB

  test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB

  redis latest 7614ae9453d1 6 months ago 113MB

  ubuntu latest ba6acccedd29 8 months ago 72.8MB

  [root@VM-0-12-centos /]# docker images

  REPOSITORY TAG IMAGE ID CREATED SIZE

  test/myubuntu 1.1 051bc4b8a6dc 36 minutes ago 178MB

  test/ubuntu 1.0 6b48c540913d 21 hours ago 72.8MB

  redis latest 7614ae9453d1 6 months ago 113MB

  ubuntu latest ba6acccedd29 8 months ago 72.8MB

  [root@VM-0-12-centos /]# docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com

  Password:

  WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

  Configure a credential helper to remove this warning. See

  https://docs.docker.com/engine/reference/commandline/login/#credentials-store

  Login Succeeded

  [root@VM-0-12-centos /]# docker tag 051bc4b8a6dc registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1

  [root@VM-0-12-centos /]#

  [root@VM-0-12-centos /]#

  [root@VM-0-12-centos /]# docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1

  The push refers to repository [registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images]

  18ff89b424df: Pushing [============== ] 29.42MB/104.8MB

  3414f251cfcb: Pushing [======== ] 12.48MB/72.78MB

  18ff89b424df: Pushed

  3414f251cfcb: Pushed

  1.1: digest: sha256:1a62548283122eadf1fc312195f0fd564b1dc549521dd8d8e4e880090abd1858 size: 741

  

 

  镜像发布到私有库

  大致流程和发布到阿里云类似.

  下载私服工具

  Docker Registry

  官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

  Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

  Docker Registry是官方提供的工具,可以用于构建私有镜像仓库;

  搭建私服的步骤

  docker pull registry

  运行私有库

  运行私有库Registry,相当于本地有个私有Docker hub

  docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry 默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调;

  查看私服库上的镜像

  curl -XGET http://192.168.111.162:5000/v2/_catalog

  

[root@VM-0-12-centos docker]# curl -XGET http://localhost:5000/v2/_catalog

 

  {"repositories":["test/myubuntu"]}

  

 

  将镜像发布到私服

  修改镜像的 tag

  公式: docker tag 镜像:Tag Host:Port/Repository:Tag

  

docker tag test/myubuntu:1.2 localhost:5000/test/myubuntu:1.2

 

  

 

  修改配置文件,使其支持http

  

[root@VM-0-12-centos docker]# vim /etc/docker/daemon.json

 

   "registry-mirrors": ["https://8p4po18u.mirror.aliyuncs.com"],

   "insecure-registries": ["localhost:5000"]

  

 

  push 镜像到主机

  

docker push localhost:5000/test/myubuntu:1.2

 

  a8bb6d556bb6: Pushed

  9f54eef41275: Pushed

  1.2: digest: sha256:fea65b4a65b5e2a7a8c070232f2aed54f76332943c9288d273e7f65f1a3a8d7b size: 741

  

 

  容器数据卷

  docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

  --privileged=true: 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

  卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: