容器入门(3) - docker

13 篇文章 1 订阅

OpenShift 4.x HOL教程汇总


说明

安装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的配置文件包括如下几个:

  1. “/etc/sysconfig/docker”:定义了docker服务启动参数,证书目录(“/etc/docker”)。
  2. “/etc/containers/registries.conf":专门定义docker可以访问的Container Registry,包括“[registries.search]”、“[registries.insecure]”、“[registries.block]”、“[registry.mirror]”。这几个参数不可以同时在“/etc/containers/registries.conf"和"/etc/docker/daemon.json"中定义。
  3. “/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

  1. 创建或编辑 /etc/docker/daemon.json 文件,增加以下 registry-mirrors 内容。
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
  1. 重新加载 docker daemon 配置,重启 docker 服务。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

登录/登出Container Registry,以及登录身份凭证

  1. 用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"
                }
        }
}
  1. 在docker登录后再执行其他Registry有关操作,docker会是使用config.json进行认证身份。
  2. 执行命令登出Container Registry,可以发现此时缺省认证文件auth.json中已经没有认证信息了。
$ docker logout ${REGISTRY_DOMAIN}:5000
$ cat ~/.docker/config.json
{
        "auths": {}
}

查询镜像

  1. docker默认是搜索“[registries.search]”中配置的registry。
  2. 查询“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
  1. 查本地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 镜像

  1. 将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
  1. 查看本地镜像缓存。注意“IMAGE ID”的内容是上面““Storing signatures”的一部分。
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              c7c37e472d31        6 days ago          1.22 MB
  1. 查看这个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"
            }
        },
。。。
  1. 查看存储镜像目录:${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”。

保存镜像-恢复镜像

  1. 执行命令,确认本地有busybox镜像。
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              c7c37e472d31        6 days ago          1.22 MB
  1. 执行命令,将本地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
  1. 将本地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
  1. 从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

运行容器,并观察对应进程和使用的存储

  1. 在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
  1. 在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)
  1. 在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
  1. 执行命令,查看分配给这个容器的可写目录。
$ 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"
            }
        },
。。。
  1. 在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
  1. 在Terminal 1中运命令,从“busybox”容器中退出。
/ # exit
  1. 再次在Terminal 2中运命令,查找名为“hello.txt”的文件。确认只能在“xxxxxxxxxxxxxxxxxx/diff/mydir1”目录中查到1个名为“hello.txt”的文件了。
$ find / -name hello.txt
/var/lib/docker/overlay2/71eb1e5b9b82eeca5261ad74b713ee9d6f7ad86e4c88314a0d940c8a651fdd5e/diff/mydir1/hello.txt
  1. 执行命令,查看busybox-local容器的文件系统变化情况。
$ docker diff busybox-local
D /mydir1
A /mydir1/hello.txt
C /root
A /root/.ash_history
D /run
A /run/secrets

查看容器日志

  1. 在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
  1. 执行命令,查看名为 busybox-local的容器日志。
$ docker logs busybox-local
/ # mkdir mydir1
/ # echo hello > mydir1/hello.txt
/ # hostname
bd568e08527a
/ # exit

查看容器运行实时状态

  1. 在Terminal 1中运行命令,继续运行busybox-local容器。
$ docker start -ia busybox-local
  1. 执行命令,查看容器运行运行的实施消耗资源情况。
$ 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

运行停止的容器

  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
  1. 在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
  1. 在Terminal 1中执行命令,根据在本地已有的“busybox-local”容器重新运行。在进入“busybox-local”容器内部后再次退出。
$ docker start -ai busybox-local
/ # exit

删除容器

  1. 在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
  1. 在Terminal 1中执行命令,删除busybox-local容器。
$ docker rm busybox-local
busybox-local
  1. 或者在Terminal 1中执行以下命令,将所有不运行的容器全部删除,
$ docker container prune
Are you sure you want to continue? [y/N] y
Deleted Containers:
f985ccb5f38d5047fab13a603a6c8018eb8d43d6c16ea71f70b9cea25598f738
 
Total reclaimed space: 5 B
  1. 在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 服务配置代理。

  1. 以下验证的时候使用了 Windows 的 CCProxy 软件作为 Linux 的代理服务器。
    在这里插入图片描述
  2. 在 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 服务配置代理

  1. 确认在没有代理配置的时候,docker 是无法从 docker.io 获取到 Image。
$ sudo docker pull docker.io/openshift/hello-openshift
  1. 创建或修改 /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"
  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
  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。

  1. 创建或修改 ~/.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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值