文章目录
说明:
- 由于会使用本地的Container Registry,因此在开始本章前,建议先完成《容器入门(1) - 安装和使用Docker
Registry》
安装Docker运行环境
本文中的docker是RHEL或CentOS的YUM提供的定制版环境,所以在配置RedHat的Yum即可安装Docker客户端并启动对应的服务。
$ cat > /etc/yum.repos.d/docker.repo << EOF
[extras]
name=CentOS 7 - Extras
baseurl=http://mirrors.163.com/centos/7/extras/x86_64
gpgcheck=0
EOF
$ yum -y install docker
$ systemctl start docker
客户端配置文件
Docker的配置文件包括如下几个:
- “/etc/sysconfig/docker”:定义了docker服务启动参数,证书目录(“/etc/docker”)。
- “/etc/containers/registries.conf":专门定义docker可以访问的Container Registry,包括“[registries.search]”、“[registries.insecure]”、“[registries.block]”、“[registry.mirror]”。这几个参数不可以同时在“/etc/containers/registries.conf"和"/etc/docker/daemon.json"中定义。
- “/etc/docker/daemon.json:定义所有Docker Daeman启动的参数。也可包括“[registries.search]”、“[registries.insecure]”、“[registries.block]”、“[registry.mirror]”这些参数,但是它们不能同时在“/etc/containers/registries.conf"和”/etc/docker/daemon.json"中定义。
我们可以通过执行“docker info”查看这些配置是否生效。
$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Authorization: rhel-push-plugin
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: e45dd70447fb72ee4e1f6989173aa6c5dd492d87 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
selinux
Kernel Version: 3.10.0-1062.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.7 (Maipo)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 2
Total Memory: 1.952 GiB
Name: registry
ID: 2I2R:E54T:LXTT:WJHA:QUSB:QBWL:U6OQ:VW7S:ORIU:WFHF:ND25:H2XK
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Experimental: false
Insecure Registries:
insecure-registry.example.com
127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure), registry.fedoraproject.org (secure), quay.io (secure), registry.access.redhat.com (secure), registry.centos.org (secure), docker.io (secure)
从以上看到“Docker Root Dir: /var/lib/docker”,所以可以执行命令设置:
$ DOCKER_DATA_DIR=/var/lib/docker
为 docker daemon 配置容器镜像 mirror
- 创建或编辑 /etc/docker/daemon.json 文件,增加以下 registry-mirrors 内容。
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
- 重新加载 docker daemon 配置,重启 docker 服务。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
登录/登出Container Registry,以及登录身份凭证
- 用docker登录Container Registry,docker会自动将登录认证的凭证写到“~/.docker/config.json”文件(较早版本的docker写入的是~/.dockercfg文件。目前docker兼容旧版文件,因此会先找config.json文件,如果找不到会再找dockercfg文件)中。
$ docker login ${REGISTRY_DOMAIN}:5000 -u user1 -p password1
Login Succeeded
$ cat ~/.docker/config.json
{
"auths": {
"registry.domain.com:5000": {
"auth": "dXNlcjE6cGFzc3dvcmQx"
}
}
}
- 在docker登录后再执行其他Registry有关操作,docker会是使用config.json进行认证身份。
- 执行命令登出Container Registry,可以发现此时缺省认证文件auth.json中已经没有认证信息了。
$ docker logout ${REGISTRY_DOMAIN}:5000
$ cat ~/.docker/config.json
{
"auths": {}
}
查询镜像
- docker默认是搜索“[registries.search]”中配置的registry。
- 查询“docker.io/busybox”镜像,只返回3个结果。
$ docker search docker.io/busybox --limit 3
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/busybox Busybox base image. 1931 [OK]
docker.io docker.io/radial/busyboxplus Full-chain, Internet enabled, busybox made f... 31 [OK]
docker.io docker.io/yauritux/busybox-curl Busybox with CURL 8
- 查本地Registry上的busybox镜像。
$ docker search ${REGISTRY_DOMAIN}:5000/busybox --limit 3
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
domain.com:5000 registry.domain.com:5000/busybox 0
pull/push 镜像
- 将busybox镜像从docker.io拉到本地缓存。注意“Storing signatures”后面的字符创。
$ docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
91f30d776fb2: Pull complete
Digest: sha256:9ddee63a712cea977267342e8750ecbc60d3aab25f04ceacfa795e6fce341793
Status: Downloaded newer image for docker.io/busybox:latest
- 查看本地镜像缓存。注意“IMAGE ID”的内容是上面““Storing signatures”的一部分。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest c7c37e472d31 6 days ago 1.22 MB
- 查看这个Image的详细配置,其中GraphDriver部分为该Image在本地存储的位置。
$ docker image inspect docker.io/busybox
。。。
"GraphDriver": {
"Name": "overlay2",
"Data": {
"MergedDir": "/var/lib/docker/overlay2/dc19da25fc03060784f3208045fda1ac0a7008f1f4eab3988f6a5585f7f5f79e/merged",
"UpperDir": "/var/lib/docker/overlay2/dc19da25fc03060784f3208045fda1ac0a7008f1f4eab3988f6a5585f7f5f79e/diff",
"WorkDir": "/var/lib/docker/overlay2/dc19da25fc03060784f3208045fda1ac0a7008f1f4eab3988f6a5585f7f5f79e/work"
}
},
。。。
- 查看存储镜像目录:${DOCKER_DATA_DIR}/overlay2/dc19da25fc03060784f3208045fda1ac0a7008f1f4eab3988f6a5585f7f5f79e/diff”。
$ ll ${DOCKER_DATA_DIR}/overlay2/dc19da25fc03060784f3208045fda1ac0a7008f1f4eab3988f6a5585f7f5f79e/diff
total 16
drwxr-xr-x. 2 root root 12288 Jun 26 20:21 bin
drwxr-xr-x. 2 root root 6 Jun 26 20:21 dev
drwxr-xr-x. 3 root root 79 Jun 26 20:21 etc
drwxr-xr-x. 2 65534 65534 6 Jun 26 20:21 home
drwx------. 2 root root 6 Jun 26 20:21 root
drwxrwxrwt. 2 root root 6 Jun 26 20:21 tmp
drwxr-xr-x. 3 root root 18 Jun 26 20:21 usr
drwxr-xr-x. 4 root root 30 Jun 26 20:21 var
访问非安全的Registry
当docker访问Registry的时候进行build、commit、pull或push操作的时候,如果所访问的Registry在“[registries.insecure]”中,那么docker缺省用“–tls-verify=false”发起请求。如果访问其它Registry(没有在registries.conf中定义或在registries.conf中定义为“[registries.search]”),docker缺省用“–tls-verify=true”发起请求。如果需要不使用上述缺省访问,可以在命令中会用“–tls-verify”。
保存镜像-恢复镜像
- 执行命令,确认本地有busybox镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest c7c37e472d31 6 days ago 1.22 MB
- 执行命令,将本地docker.io/library/busybox:latest镜像保存到文件中。
$ docker image save docker.io/busybox:latest -o busybox.tar
$ ll busybox.tar
-rw-------. 1 root root 1451008 Jul 6 10:11 busybox.tar
- 将本地docker.io/library/busybox:latest镜像删除。
$ docker rmi docker.io/library/busybox:latest
Untagged: docker.io/busybox:latest
Untagged: docker.io/busybox@sha256:9ddee63a712cea977267342e8750ecbc60d3aab25f04ceacfa795e6fce341793
Deleted: sha256:c7c37e472d31c1685b48f7004fd6a64361c95965587a951692c5f298c6685998
Deleted: sha256:50761fe126b6e4d90fa0b7a6e195f6030fe250c016c2fc860ac40f2e8d2f2615
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
- 从busybox.tar文件加载busybox镜像,然后确认镜像已经加载成功。
$ docker image load -i busybox.tar
50761fe126b6: Loading layer [==================================================>] 1.442 MB/1.442 MB
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest c7c37e472d31 6 days ago 1.22 MB
运行容器,并观察对应进程和使用的存储
- 在Terminal 1中运行busybox容器,然后在其中创建1个目录和hello.txt,然后查看容器内的主机名。注意不要退出。
$ docker run --name busybox-local -it ${REGISTRY_DOMAIN}:5000/busybox
/ # mkdir mydir1
/ # echo hello > mydir1/hello.txt
/ # hostname
bd568e08527a
- 在Terminal 2中运命令,查看运行的容器。其中“CONTAINER ID”为“bd568e08527a”,和容器内的主机名相同。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd568e08527a docker.io/busybox "sh" 2 minutes ago Up 2 minutes busybox-local
$ CONTAINER_ID=$(docker inspect --format="{{.Id}}" busybox-local)
- 在Terminal 2中运命令,根据“CONTAINER ID”查看宿主机的系统进程。
$ ps -ef | grep ${CONTAINER_ID}
root 7798 4621 0 10:36 ? 00:00:00 /usr/bin/docker-containerd-shim-current bd568e08527a95336d05aa601bc85937cc068cbc8b8e172b8da298c0c42f1510 /var/run/docker/libcontainerd/bd568e08527a95336d05aa601bc85937cc068cbc8b8e172b8da298c0c42f1510 /usr/libexec/docker/docker-runc-current
ll ${DOCKER_DATA_DIR}/containers/${CONTAINER_ID}/
total 24
drwx------. 2 root root 6 Jul 6 10:36 checkpoints
-rw-r--r--. 1 root root 2497 Jul 6 10:36 config.v2.json
-rw-r--r--. 1 root root 1123 Jul 6 10:36 hostconfig.json
-rw-r--r--. 1 root root 13 Jul 6 10:36 hostname
-rw-r--r--. 1 root root 174 Jul 6 10:36 hosts
-rw-r--r--. 1 root root 53 Jul 6 10:36 resolv.conf
-rw-r--r--. 1 root root 71 Jul 6 10:36 resolv.conf.hash
drwxr-xr-x. 3 root root 37 Jul 6 10:36 secrets
drwxrwxrwt. 2 root root 40 Jul 6 10:36 shm
$ more ${DOCKER_DATA_DIR}/containers/${CONTAINER_ID}/hostname
bd568e08527a
$ more ${DOCKER_DATA_DIR}/containers/${CONTAINER_ID}/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 bd568e08527a
192.168.1.6 registry.domain.com
- 执行命令,查看分配给这个容器的可写目录。
$ docker inspect busybox-local
。。。
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e-init/diff:/var/lib/docker/overlay2/66503a4e15ca0d58f694d56764662b97237cc8d11686feb3a5aa0df5b482f015/diff",
"MergedDir": "/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/merged",
"UpperDir": "/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/diff",
"WorkDir": "/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/work"
}
},
。。。
- 在Terminal 2中运命令,查找名为“hello.txt”的文件。确认可以查到2个名为“hello.txt”的文件,一个是在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目录中,另一个在“xxxxxxxxxxxxxxxxxx/merged/mydir1”中。
$ find / -name hello.txt
/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/diff/mydir1/hello.txt
/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/merged/mydir1/hello.txt
- 在Terminal 1中运命令,从“busybox”容器中退出。
/ # exit
- 再次在Terminal 2中运命令,查找名为“hello.txt”的文件。确认只能在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目录中查到1个名为“hello.txt”的文件了。
$ find / -name hello.txt
/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/diff/mydir1/hello.txt
- 执行命令,查看busybox-local容器的文件系统变化情况。
$ docker diff busybox-local
D /mydir1
A /mydir1/hello.txt
C /root
A /root/.ash_history
D /run
A /run/secrets
查看容器日志
- 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd568e08527a registry.domain.com:5000/busybox:latest sh 48 seconds ago Exited (0) 30 seconds ago busybox-local
- 执行命令,查看名为 busybox-local的容器日志。
$ docker logs busybox-local
/ # mkdir mydir1
/ # echo hello > mydir1/hello.txt
/ # hostname
bd568e08527a
/ # exit
查看容器运行实时状态
- 在Terminal 1中运行命令,继续运行busybox-local容器。
$ docker start -ia busybox-local
- 执行命令,查看容器运行运行的实施消耗资源情况。
$ docker stats --all
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O
bd568e08527a 0.00% 64 KiB / 1.952 GiB 0.00% 656 B / 656 B 0 B / 0 B 1
运行停止的容器
- 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84625108be74 registry.domain.com:5000/busybox:latest sh 48 seconds ago Exited (0) 30 seconds ago busybox-local
- 在Terminal 1中再次执行以下命令,将报错,提示已经名为“busybox-local”的容器已经在本地存储中了。
$ docker run --name busybox-local -ai ${REGISTRY_DOMAIN}:5000/busybox
Error: error creating container storage: the container name "busybox-local" is already in use by "84625108be74a36b64e24edec59483c5340d0f768d7355a3c64ec7660dd80686". You have to remove that container to be able to reuse that name.: that name is already in use
- 在Terminal 1中执行命令,根据在本地已有的“busybox-local”容器重新运行。在进入“busybox-local”容器内部后再次退出。
$ docker start -ai busybox-local
/ # exit
删除容器
- 在Terminal 1中执行命令,查看所有运行的容器,其中有刚刚运行并退出的“busybox-local”容器。此时该容器的环境还在,只不过没有运行。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84625108be74 registry.domain.com:5000/busybox:latest sh 44 minutes ago Exited (0) 7 minutes ago busybox-local
- 在Terminal 1中执行命令,删除busybox-local容器。
$ docker rm busybox-local
busybox-local
- 或者在Terminal 1中执行以下命令,将所有不运行的容器全部删除,
$ docker container prune
Are you sure you want to continue? [y/N] y
Deleted Containers:
f985ccb5f38d5047fab13a603a6c8018eb8d43d6c16ea71f70b9cea25598f738
Total reclaimed space: 5 B
- 在Terminal 1中执行命令,已经找不到“hello.txt”了。
$ find / -name hello.txt
Docker运行环境管理
查看运行环境信息
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 1.224 MB 1.224 MB (100%)
Containers 0 0 0 B 0 B
Local Volumes 0 0 0 B 0 B
删除所有不用的容器、镜像
$ docker system prune --all
在 Proxy 环境中使用
docker 服务通过 proxy 访问外部 Registry
proxy 环境说明
在运行 docker 的环境中如果只能通过 Proxy 访问互联网,需要为 docker 的 demon 服务配置代理。
- 以下验证的时候使用了 Windows 的 CCProxy 软件作为 Linux 的代理服务器。
- 在 Linux 中配置 firewall,设置 OUTPUT 只能访问 proxy 地址(192.168.1.41),对其他 OUTPUT 地址的访问全被忽略。这样就能保证 Linux 只能通过 proxy 访问到外网。
sudo firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -j DROP
sudo firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -d 192.168.1.41 -j ACCEPT
sudo firewall-cmd --direct --get-all-rules
sudo systemctl restart firewalld
为 docker 服务配置代理
- 确认在没有代理配置的时候,docker 是无法从 docker.io 获取到 Image。
$ sudo docker pull docker.io/openshift/hello-openshift
- 创建或修改 /etc/systemd/system/docker.service.d/http-proxy.conf 文件,增加以下 Proxy 配置。注意:http://192.168.1.41:808 是 proxy 的 HTTP 协议访问地址,另外 HTTPS_PROXY 的配置也使用了 HTTP 协议。
[Service]
Environment="HTTP_PROXY=http://192.168.1.41:808"
Environment="HTTPS_PROXY=http://192.168.1.41:808"
Environment="NO_PROXY=localhost,127.0.0.1"
- 重新加载 docker daemon,重启 docker 服务。然后确认 docker 服务的 Environment 属性中已经有了 Proxy 的配置。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo systemctl show --property=Environment docker
HTTP_PROXY=http://192.168.1.41:808 HTTPS_PROXY=http://192.168.1.41:808 NO_PROXY=localhost,127.0.0.1
- 此时 docker 就可以经过 proxy 访问获取外部 Registry 的 image。
$ sudo docker pull docker.io/openshift/hello-openshift
docker client 通过 proxy 访问 docker 服务
如果 docker client 需要 proxy 访问 docker service,则需要为 docker client 配置 proxy。
- 创建或修改 ~/.docker/config.json 文件增加 proxy 配置,其中将 httpProxy 和 httpProxy 统一设置为 proxy 的 HTTP 协议访问地址 http://192.168.1.41:808。
{
"proxies":
{
"default":
{
"httpProxy": "http://192.168.1.41:808",
"httpsProxy": "http://192.168.1.41:808",
"noProxy": "localhost,127.0.0.0/8"
}
}
}
参考
https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
https://docs.docker.com/network/proxy/
https://blog.csdn.net/kfepiza/article/details/127158036