容器入门(3) - docker
《OpenShift 4.x HOL教程汇总》
文章目录
- 安装Docker客户端
- 客户端配置文件
- 登录/登出Container Registry
- 登录身份凭证
- 查询镜像
- pull/push 镜像
- 访问非安全的Registry
- 保存镜像-恢复镜像
- 运行容器,并观察对应进程和使用的存储
- 查看容器日志
- 查看容器运行实时状态
- 运行停止的容器
- 删除容器
- Docker运行环境管理
- 查看运行环境信息
- 删除所有不用的容器、镜像
说明:
- 由于会使用本地的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=0EOF$ 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: 0Running: 0Paused: 0Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:Volume: localNetwork: bridge host macvlan null overlayAuthorization: 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:seccompWARNING: You're not using the default seccomp profileProfile: /etc/docker/seccomp.jsonselinux
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.com127.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
登录/登出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-currentll ${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:
f985ccb5f38d5047fab13a603a6c8018eb8d43d6c16ea71f70b9cea25598f738Total 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
容器入门(3) - docker相关推荐
- 自动化集成:Docker容器入门简介
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Docker基础用法. 一.Docker简介 1.基础 ...
- 容器入门(6) - 获取访问Docker Registry的公钥证书
<OpenShift 4.x HOL教程汇总> 获取问Docker Registry的证书 在根据<容器入门(1) - 安装和使用Docker Registry>,我们可以使用 ...
- Docker容器入门及网易最佳实践
文章目录 第一节 Docker容器入门 1.1.1 基础概念 1. Docker是什么 2. Docker和传统虚拟机的对比 3. 为什么要使用Docker 4. Docker架构 5. Docker ...
- Docker容器入门-基本命令的使用
目前容器技术使用相当广泛 不会或者没有使用过容器感觉都不像是个搞技术的 所以,我也就docker相关内容做一个整理 只有不断的学习,才能保持自己的竞争力 什么是容器? 容器是一种轻量级.可移植.自包含 ...
- Docker入门 - 005 Docker 容器连接
Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...
- 容器入门(1) - 安装和使用Docker Registry
<OpenShift 4.x HOL教程汇总> 文章目录 部署拓扑 准备宿主机 创建SSL证书和用户认证文件 安装Docker环境 打开防火墙 安装Docker Registry 基于容器 ...
- 容器化技术Docker由入门到实战
目录 对docker的理解 能做什么 传统虚拟机 容器虚拟化技术 Docker 和传统虚拟化方式的不同之处 Docker的安装 前置环境 Vagrant虚拟机环境 编辑使用Vgrant安装虚拟机 虚 ...
- Docker 容器入门
1.1 容器简介 1.1.1 什么是 Linux 容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件.容器提供的镜像包含了应用的所有依赖项, ...
- 容器安全 - 限制docker/podman只能使用有效签名的镜像
<OpenShift 4.x HOL教程汇总> 文章目录 注册quay.io用户 限制只能使用有效签名的镜像 其他 说明:本文使用RHEL或CentOS自带的podman作为容器运行环境, ...
最新文章
- 工业用微型计算机笔记(5)-指令系统(2)
- firefox+android+平板,Firefox OS首款平板现身,“三头并进”追赶Android
- 正则表达式格式化日期
- Zookeeper: Zookeeper架构及FastLeaderElection机制
- 关于 vim 的 magic 设置
- 【CF#801 A.】 Vicious Keyboard(字符串查找,水题)
- 微服务应用实现无损上下线实践
- 线程中可以创建进程吗_Linux 进程线程是如何创建的?
- 易语言 取自定义数据类型的大小
- 垂直搜索引擎模块设计
- awr报告与statspack报告
- 老外写的比较好用的splitter控件
- 笛科思软件培训方案txwtech software training plan
- XJOI一级六段题解(g++,即C++),也可视作C++算法竞赛教程
- 笔记:修改host文件
- 硬件工程师成长之路(1)——元件基础
- 愿岁月流成花海,你我结伴而行
- MySQL中对比两张表是否有不同数据
- mysql一次count多个字段_SQL一次查出多个字段的COUNT值
- ios浏览器打开app页面提示“浏览器打不开该网页,因为网址无效”
热门文章
- 计算机专业开题报告指导老师意见评语,开题报告指导教师评语
- python怎么安装xlrd库_Python第三方库xlrd/xlwt的安装与读写Excel表格
- lua 获取网络时间_Lua脚本引擎教程:学习路线
- 计算机导论 网络,计算机导论(网络).ppt
- APP设计灵感|高颜值时钟页面!让每一秒都过得有意义
- UI干货素材分享|导航设计
- UI网页头部设计模板素材|这么多讲究,你知道吗?
- oracle jvm禁用,java-如何减少Sun / Oracle JVM内部开销?
- python读取数据库中指定内容_python如何用正则表达式读取对应字段写入数据库中?...
- Linux hypervisor VMM介绍