docker基础命令

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的性能相对要强一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值