docker常用操作
docker发展史
docker本身不是容器,它只是一个更加易用的前端管理器。
最早期的容器技术概念是用chroot来实现隔离,但是chroot只是提供了对进程文件目录虚拟化的功能,不能防止进程恶意访问系统。
直到2008年 LXC(Linux Containers"牛奶牌牛奶"),一套完整的Linux容器管理实现方案,也有如别的方案如:OpenVZ等…
docker在起步阶段使用lxc,但发现其并不是那么好用,于是docker公司就自己把cgroups和lxc做了一个联合封装。lxc向上提供的接口做了二次封装,使其变成更易用的容器管理界面和容器管理逻辑。从而使得整个容器的使用变得更加简便了。
基础命令
命令 | 功能 |
---|---|
docker search | 在 Docker 中心搜索映像 |
docker pull | 从注册表中拉取映像或存储库 |
docker images | 列出图像 |
docker create | 创建新的连接器 |
docker start | 启动一个或多个已停止的容器 |
docker run | 在新容器中运行命令 |
docker attach | 连接到运行容器 |
docker ps | 列出容器 |
docker logs | 获取容器的日志 |
docker restart | 重新启动容器 |
docker stop | 停止一个或多个正在运行的容器 |
docker kill | 杀死一个或多个正在运行的容器 |
docker rm | 删除容器或更多容器 |
docker exec | 在正在运行的容器中运行命令 |
docker info | 显示系统范围的信息 |
docker inspect | 返回有关 Docker 对象的低级信息 |
dacker rm -f $ (docker ps -aq) 删除多个容器
docker的安装以及使用
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 100 1919 100 1919 0 0 1104 0 0:00:01 0:00:01 --:--:-- 1104
[root@localhost yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@localhost yum.repos.d]# ls
CentOS-Stream-AppStream.repo CentOS-Stream-NFV.repo
CentOS-Stream-BaseOS.repo CentOS-Stream-PowerTools.repo
CentOS-Stream-Debuginfo.repo CentOS-Stream-RealTime.repo
CentOS-Stream-Extras.repo CentOS-Stream-ResilientStorage.repo
CentOS-Stream-HighAvailability.repo CentOS-Stream-Sources.repo
CentOS-Stream-Media.repo docker-ce.repo
[root@localhost yum.repos.d]# yum -y install docker-ce
[root@localhost ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendo>
Active: active (running) since Fri 2022-08-05 03:15:08 EDT; 40s ago
Docs: https://docs.docker.com
Main PID: 43788 (dockerd)
Tasks: 9
Memory: 30.6M
CGroup: /system.slice/docker.service
└─43788 /usr/bin/dockerd -H fd:// --containerd=/run/containerd>
Aug 05 03:15:07 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:07 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:07 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
Aug 05 03:15:08 localhost.localdomain systemd[1]: Started Docker Applicat>
Aug 05 03:15:08 localhost.localdomain dockerd[43788]: time="2022-08-05T03>
[root@localhost ~]#
docker配置加速器
[root@localhost ~]# cd /etc/docker/
[root@localhost docker]# ls
key.json
[root@localhost docker]# vim daemon.json
[root@localhost docker]# cat daemon.json
{
"registry-mirrors": ["https://fi54miqv.mirror.aliyuncs.com"]
}
[root@localhost docker]# systemctl restart docker
[root@localhost docker]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:03:11 2022
docker基础命令
pull拉取镜像命令
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]#
images列出图像命令
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 10 months ago 231MB
rm删除镜像命令
[root@localhost ~]# docker rmi centos
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
[root@localhost ~]#
info显示系统范围的信息
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.
...
Registry Mirrors:
https://fi54miqv.mirror.aliyuncs.com/ #这个是我们的配置的加速器。
Live Restore Enabled: false
[root@localhost ~]#
search 在 Docker 中心搜索映像
[root@localhost ~]# docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4107 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 44
centos/httpd 35 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 2
hypoport/httpd-cgi httpd-cgi
create 创建新的连接器
[root@localhost ~]# docker create busybox
92b761bb47df04f1924a3be7fcae3fdfa2b2a52cb1a504a1f1aa7ed7bd5b3466
ps -a 列出所有容器的信息
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92b761bb47df busybox "sh" 25 seconds ago Created bold_feistel
[root@localhost ~]#
start 启动容器
[root@localhost ~]# docker start 92b761bb47df
92b761bb47df
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92b761bb47df busybox "sh" 4 minutes ago Exited (0) 6 seconds ago bold_feistel
[root@localhost ~]# docker create -it busybox sleep 6000
0f3bfbe39e54c38f3fbd285b7332bd691f46f12f19937cf8219b61da1f6cd6a0
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f3bfbe39e54 busybox "sleep 6000" 34 seconds ago Created exciting_goldstine
92b761bb47df busybox "sh" 6 minutes ago Exited (0) 2 minutes ago bold_feistel
[root@localhost ~]# docker start 0f3bfbe39e54
0f3bfbe39e54
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f3bfbe39e54 busybox "sleep 6000" 58 seconds ago Up 7 seconds exciting_goldstine
92b761bb47df busybox "sh" 6 minutes ago Exited (0) 2 minutes ago bold_feistel
[root@localhost ~]#
run 创建新的容器并运行
[root@localhost ~]# docker run -d --name web httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
680ca74f22a3e14b9d24669bbb9d95c75c830d30d4bc951777c628d5383e0420
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
680ca74f22a3 httpd "httpd-foreground" 45 seconds ago Up 43 seconds 80/tcp web
[root@localhost ~]# docker run -d --name web -p 80:80 httpd
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]#
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xk1XgsDp-1659919504393)(C:\Users\kang\AppData\Roaming\Typora\typora-user-images\image-20220805155652762.png)]
logs 容器名 查看容器的运行日志,第一次访问是200,后面是缓存是304.
[root@localhost ~]# docker logs web
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
[Fri Aug 05 07:55:42.635689 2022] [mpm_event:notice] [pid 1:tid 140612982988096] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Fri Aug 05 07:55:42.635831 2022] [core:notice] [pid 1:tid 140612982988096] AH00094: Command line: 'httpd -D FOREGROUND'
192.168.171.1 - - [05/Aug/2022:07:55:48 +0000] "GET / HTTP/1.1" 200 45
192.168.171.1 - - [05/Aug/2022:07:55:48 +0000] "GET /favicon.ico HTTP/1.1" 404 196
192.168.171.1 - - [05/Aug/2022:07:56:40 +0000] "-" 408 -
192.168.171.1 - - [05/Aug/2022:07:58:41 +0000] "GET / HTTP/1.1" 304 -
192.168.171.1 - - [05/Aug/2022:07:58:42 +0000] "GET / HTTP/1.1" 304 -
192.168.171.1 - - [05/Aug/2022:07:58:43 +0000] "GET / HTTP/1.1" 304 -
192.168.171.1 - - [05/Aug/2022:07:58:44 +0000] "GET / HTTP/1.1" 304 -
[root@localhost ~]#
restart重启容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp web
0f3bfbe39e54 busybox "sleep 6000" 15 minutes ago Up 14 minutes exciting_goldstine
[root@localhost ~]# docker restart web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 7 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
0f3bfbe39e54 busybox "sleep 6000" 15 minutes ago Up 15 minutes exciting_goldstine
[root@localhost ~]#
stop停止容器
[root@localhost ~]# docker stop web
web
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 10 minutes ago Exited (0) 17 seconds ago web
0f3bfbe39e54 busybox "sleep 6000" 18 minutes ago Up 17 minutes exciting_goldstine
92b761bb47df busybox "sh" 23 minutes ago Exited (0) 19 minutes ago bold_feistel
[root@localhost ~]#
kill 非正常退出容器,用stop退出的状态码为0 ,用kill退出的状态码为137.
kill删除正常容器可以,但是需要删除运行中的容器是不可以的,但是加上-f就可以了。
[root@localhost ~]# docker kill 0f3bfbe39e54
0f3bfbe39e54
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 13 minutes ago Exited (0) 3 minutes ago web
0f3bfbe39e54 busybox "sleep 6000" 21 minutes ago Exited (137) 3 seconds ago exciting_goldstine
92b761bb47df busybox "sh" 27 minutes ago Exited (0) 23 minutes ago bold_feistel
[root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 15 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
[root@localhost ~]# docker rm web
Error response from daemon: You cannot remove a running container ace54afe9982f10713df73c57ca9fb5a9840094914284a43c913e82ba6e4e08a. Stop the container before attempting removal or force remove
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ace54afe9982 httpd "httpd-foreground" 15 minutes ago Up 13 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
[root@localhost ~]# docker rm -f web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
docker ps -aq 列出所有运行的容器
docker rm -f $(docker ps -aq)删除所有运行的容器。
[root@localhost ~]# docker ps -aq
0611dd480a88
78871f3fd55f
04aaaef417be
7a67e2714ad8
92e6db1f5ce7
0f3bfbe39e54
92b761bb47df
[root@localhost ~]#
[root@localhost ~]# docker rm -f $(docker ps -aq)
0611dd480a88
78871f3fd55f
04aaaef417be
7a67e2714ad8
92e6db1f5ce7
0f3bfbe39e54
92b761bb47df
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
inspect 返回有关 Docker 对象的低级信息
[root@localhost ~]# docker inspect bf7bc5b05e24
[
{
"Id": "bf7bc5b05e24c98cfac0b1b997d3f8c6dcbd2e3430bdd40cc42d06fa81879cc2",
"Created": "2022-08-05T08:19:58.579335404Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
...
attach 进入容器里面什么都不能做,退出容器就停止了
[root@localhost ~]# docker attach a3b34e225873
[root@localhost ~]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
[root@localhost ~]#
172.17.0.1 - - [05/Aug/2022:08:24:56 +0000] "GET / HTTP/1.1" 200 45
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
exec进入容器在里面可以用linux基础的命令,退出也还在
[root@localhost ~]# docker exec -it a3b34e225873 /bin/bash
root@a3b34e225873:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@a3b34e225873:/usr/local/apache2# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b34e225873 httpd "httpd-foreground" 4 minutes ago Up About a minute 80/tcp heuristic_kare
[root@localhost ~]#
docker存储驱动
AUFS
AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。
AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。
OverlayFS
Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。
AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。
DeviceMapper
Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。
OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。
会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。
OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。