Docker对象操作

1、Docker镜像的操作

docker官网寻找镜像:https://hub.docker.com/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#搜索镜像  (选项image可以省略)
[root@docker01 ~]# docker search nginx
或者
[root@docker01 ~]# docker image search nginx


#显示镜像的关键过程
[root@docker01 ~]# docker history alpine
IMAGE CREATED CREATED BY SIZE COMMENT
324bc02ae123 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:99093095d62d04215… 7.8MB




#拉取镜像: (选项image可以省略)
docker pull 从库名:标签名 (不加标签默认拉取latest版本的)

[root@docker01 ~]# docker pull nginx:alpine
或者
[root@docker01 ~]# docker image pull nginx:alpine

[root@docker01 ~]# docker pull nginx:latest


#查看拉取到的镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine 0f0eda053dc5 2 weeks ago 43.3MB
nginx latest 5ef79149e0ec 2 weeks ago 188MB
alpine latest 324bc02ae123 6 weeks ago 7.8MB
busybox latest 87ff76f62d36 15 months ago 4.26MB
centos 6 5bf9684f4720 2 years ago 194MB
centos 7 eeb6ee3f44bd 2 years ago 204MB


#删除镜像 rmi (不加标签,默认删除latest)
[root@docker01 ~]# docker rmi centos:6
或者
[root@docker01 ~]# docker image rm centos:6
或者
[root@docker01 ~]# docker rmi 5bf9684f4720


#导出镜像(一次只能导出一个)
[root@docker01 ~]# docker save centos:7 -o /tmp/c7.tgz
-o:output 输出
或者
[root@docker01 ~]# docker save centos:7 > /tmp/c7_2.tgz
>:重定向


[root@docker01 ~]# ll /tmp/ -h
-rw-r--r-- 1 root root 202M Sep 3 14:22 c7_2.tgz
-rw------- 1 root root 202M Sep 3 14:21 c7.tgz
-rw------- 1 root root 202M Sep 3 14:35 eeb6ee3f44bd.tgz


#导入镜像
[root@docker01 ~]# scp /tmp/c7.tgz 172.16.1.102:/tmp

[root@docker02 ~]# docker image load -i /tmp/c7.tgz
-i:input 输入
或者 <:标注输入
[root@docker02 ~]# docker image load < /tmp/c7.tgz

镜像层数是分层的,镜像有相同的层数,不会占用磁盘空间,再次把c7_2.tgz导进去不会重复,不会占用磁盘空间,他会自动识别到是同一个层




或者使用ID来导出(不推荐,因为导入到新环境的时候没有名字)
[root@docker01 ~]# docker save eeb6ee3f44bd -o /tmp/eeb6ee3f44bd.tgz
[root@docker01 ~]# scp /tmp/eeb6ee3f44bd.tgz 172.16.1.103:/tmp

[root@docker03 ~]# docker image load -i /tmp/eeb6ee3f44bd.tgz
[root@docker03 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> eeb6ee3f44bd 2 years ago 204MB

#给镜像加标签(改名)
docker tag ID号 镜像名:标签

[root@docker03 ~]# docker tag eeb6ee3f44bd centos:7
[root@docker03 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 eeb6ee3f44bd 2 years ago 204MB


#查看镜像的详细信息(常用)
[root@docker02 ~]# docker inspect nginx:alpine

2、Docker容器的操作

Docker 容器操作的选项

选项 作用
–name 自定义容器名
-d 将容器放后台启动
-it (input TTY) 分配一个交互式的终端
-p 端口映射
-P 映射随机端口
-v 数据卷映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#容器运行的原则:
1、一个容器最好只做一件事
(比如说搭wp,最后nginx跑一个容器,mysql跑一个容器,php跑一个容器,最好分开,如果想要一个容器跑多个应用,需要解决横向扩展的问题)
2、容器运行必须保证容器内PID为1的进程一直存在

PID为1的进程是谁决定的:
1、docker run运行容器后加的命令
2、如果在运行容器时没有加任何命令,则以容器镜像中的CMD中的命令作为PID为1的


1、#运行alpine容器
[root@docker03 ~]# docker run alpine /bin/echo 'hello world'
hello world


2、#查看正在运行的容器
[root@docker02 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ed0569ef98e alpine "/bin/echo 'hello wo…" 9 seconds ago Exited (0) 9 seconds ago affectionate_curie
a1b13ddd5328 alpine "echo hello world" 19 seconds ago Created goofy_bartik
-a:查看所有容器
[root@docker02 ~]# docker ps -aq


#运行一个容器
docker run [1个或者多个选项] 镜像 [command]
[root@docker02 ~]# docker run centos:7 /bin/bash

[root@docker01 ~]# docker run -it -d busybox /bin/sh

#让容器在后台运行
[root@docker03 ~]# docker run -d centos:7 tailf /etc/passwd

[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29d1fc5f02e3 centos:7 "tailf /etc/passwd" 28 seconds ago Up 28 seconds vibrant_ritchie

#运行容器时给容器起一个名字
[root@docker03 ~]# docker run --name wordpress -d nginx:alpine
[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c13fdc5ac70e nginx:alpine "/docker-entrypoint.…" 18 seconds ago Up 17 seconds 80/tcp wordpress

#运行一个镜像并连进去
[root@docker03 ~]# docker run -it centos:7 /bin/bash

3、#连接一个容器
如果/bin/bash不能连接进去,就换成/bin/sh
[root@docker03 ~]# docker exec -it 29d1fc5f02e3 /bin/bash
查看PID为1的进程
[root@29d1fc5f02e3 /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4364 584 ? Ss 07:11 0:00 tailf /etc/passwd

--------docker run 帮我们做了哪些事-----
[root@docker02 ~]# docker run nginx:alpine

1、拉镜像
docker pull nginx:alpine
2、创建容器
docker create nginx:alpine
3、启动容器
docker start 29d1fc5f02e3
--------------------------------

4、#停止容器
[root@docker03 ~]# docker ps
[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29d1fc5f02e3 centos:7 "tailf /etc/passwd" 17 minutes ago Up 17 minutes vibrant_ritchie

加名字
[root@docker03 ~]# docker stop vibrant_ritchie
vibrant_ritchie
或者 加ID
[root@docker03 ~]# docker stop 29d1fc5f02e3


5、#删除容器
docker rm -f [container id]

[root@docker03 ~]# docker rm 29d1fc5f02e3
[root@docker03 ~]# docker rm -f 29d1fc5f02e3
#(强制删除 -f )

#批量删除
[root@docker03 ~]# docker rm -f $(docker ps -q)
批量删除停止运行的容器 -aq
[root@docker03 ~]# docker rm -f $(docker ps -aq)


6、#代码的上传和拉取
#将代码上传到容器
[root@docker01 ~]# docker cp 1.txt 74ce711a7128:/root

#将容器里面的代码下载到本地
[root@docker01 ~]# docker cp 74ce711a7128:/etc/passwd ./



使用命令将nginx启动并且卡住,容器就不会结束
[root@docker03 ~]# nginx -g 'daemon off;'

报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、查看镜像
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 324bc02ae123 6 weeks ago 7.8MB

2、删除镜像,报错
[root@docker02 ~]# docker rmi 324bc02ae123
Error response from daemon: conflict: unable to delete 324bc02ae123 (must be forced) - image is being used by stopped container a1b13ddd5328

3、删除依赖的容器
[root@docker02 ~]# docker ps -a | grep "alpine" | awk '{print $1}' | xargs docker rm
1ed0569ef98e
a1b13ddd5328

4、删除镜像
[root@docker02 ~]# docker rmi 324bc02ae123

3、容器的端口映射

容器需要做端口映射才能让外界访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
端口映射
-p 宿主机端口:容器端口
-P 宿主机IP:宿主机端口:容器端口 (多个容器都想使用80端口)
-p 宿主机IP::容器端口(随机端口)
-p 宿主机端口:容器端口/udp (但是一般TCP的比较多)
-p 宿主机IP::容器端口/udp使用宿主机的10.0.8.183这个ip地址的随机端口的udp协议映射容器的udp53端口
-p 81:80 -p 443:443 可以指定多个-p
-p 80-88:80-88 端口范围映射


1、# -p:把容器的80端口映射到宿主机的80端口
[root@docker03 ~]# docker run -p80:80 -d nginx:alpine

[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92e2dbca064e nginx:alpine "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp adoring_hertz


浏览器访问10.0.0.103,就可以访问nginx页面

2、
[root@docker03 ~]# docker run -p8080:80 -p90:90 -d nginx:alpine

查看宿主机上有8080和90端口

-P 宿主机IP:宿主机端口:容器端口 (针对不同的IP,访问不同的容器,多个容器都想使用80端口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1、先清楚之前允许的docker
[root@docker03 ~]# docker rm -f $(docker ps -q)

2、端口映射
[root@docker03 ~]# docker run -p10.0.0.103:80:80 -d nginx:alpine
[root@docker03 ~]# docker run -p172.16.1.103:80:80 -d nginx:alpine
[root@docker03 ~]# docker run -p127.0.0.1:80:80 -d nginx:alpine

[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a87c542db29 nginx:alpine "/docker-entrypoint.…" 25 seconds ago Up 24 seconds 127.0.0.1:80->80/tcp kind_mahavira
a2d578ffff01 nginx:alpine "/docker-entrypoint.…" 47 seconds ago Up 46 seconds 172.16.1.103:80->80/tcp interesting_joliot
98e6d6611bd6 nginx:alpine "/docker-entrypoint.…" 59 seconds ago Up 58 seconds 10.0.0.103:80->80/tcp interesting_jennings

#不同的网卡,不同的ip,访问方式不一样
查看容器日志
[root@docker03 ~]# docker logs -f 容器ID
[root@docker03 ~]# docker logs -f 容器名

3、查看10.0.0.103:80->80/tcp容器的访问日志
[root@docker03 ~]# docker logs -f 98e6d6611bd6
浏览器访问10.0.0.103,可以看到日志变化,请求过来了

4、查看172.16.1.103:80->80/tcp容器的访问日志
[root@docker03 ~]# docker logs -f a2d578ffff01

打开一个新终端,使用curl命令访问,看到日志有请求就访问成功
[root@docker03 ~]# curl 172.16.1.103

5、查看127.0.0.1:80->80/tcp容器的访问日志
[root@docker03 ~]# docker logs -f 7a87c542db29
打开一个新终端,使用curl命令访问,看到日志有请求就访问成功
[root@docker03 ~]# curl 127.0.0.1

-p 宿主机IP::容器端口(随机端口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1、在宿主机上起5个随机端口
[root@docker03 ~]# docker run -p10.0.0.103::80 -d nginx:alpine
[root@docker03 ~]# docker run -p10.0.0.103::80 -d nginx:alpine
[root@docker03 ~]# docker run -p10.0.0.103::80 -d nginx:alpine
[root@docker03 ~]# docker run -p10.0.0.103::80 -d nginx:alpine
[root@docker03 ~]# docker run -p10.0.0.103::80 -d nginx:alpine

2、查看端口
[root@docker03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57ae53de8781 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 10.0.0.103:32776->80/tcp distracted_tharp
fe081b7a25ac nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 10.0.0.103:32775->80/tcp kind_knuth
2ed44ac6261f nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 10.0.0.103:32774->80/tcp clever_sinoussi
c009cf3348ff nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 10.0.0.103:32773->80/tcp inspiring_hawking
fe02a74ce3d2 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 10.0.0.103:32772->80/tcp keen_yonath

3、浏览器访问这些页面,可以看到nginx测试页
10.0.0.103:32776
10.0.0.103:32775
10.0.0.103:32774
10.0.0.103:32773
10.0.0.103:32772

-p 80-88:80-88 端口范围映射

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@docker03 ~]# docker run  -p81-85:81-85 -d nginx:alpine

[root@docker03 ~]# netstat -lntup|grep '\b8[0-9]\b'
tcp 0 0 0.0.0.0:81 0.0.0.0:*
tcp 0 0 0.0.0.0:82 0.0.0.0:*
tcp 0 0 0.0.0.0:83 0.0.0.0:*
tcp 0 0 0.0.0.0:84 0.0.0.0:*
tcp 0 0 0.0.0.0:85 0.0.0.0:*
tcp6 0 0 :::81 :::*
tcp6 0 0 :::82 :::*
tcp6 0 0 :::83 :::*
tcp6 0 0 :::84 :::*
tcp6 0 0 :::85 :::*

4、案例:运行容器,部署游戏代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1、下载代码
[root@docker01 ~]# wget http://test.driverzeng.com/Nginx_Code/h5_games.zip

2、运行nginx容器
[root@docker01 ~]# docker run -p80:80 -d nginx:alpine


3、查看运行的PID
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74ce711a7128 nginx:alpine "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp zealous_shaw


4、查看是否存在工作目录 看到不存在工作目录
[root@docker01 ~]# docker inspect nginx:alpine

5、连接到容器里面,查看站点目录
[root@docker01 ~]# docker exec -it 74ce711a7128 /bin/sh
/ # vi /etc/nginx/conf.d/default.conf
root /usr/share/nginx/html;

6、将代码上传
[root@docker01 ~]# docker cp h5_games.zip 74ce711a7128:/usr/share/nginx/html

7、这次连接到容器里面
[root@docker01 ~]# docker exec -it 74ce711a7128 /bin/sh
/ #
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # unzip h5_games.zip

/usr/share/nginx/html # ls
50x.html __MACOSX h5_games h5_games.zip index.html

8、浏览器访问
10.0.0.101/h5_games

image-20240903120700780

以上操作都比较麻烦,而且如果这个容器坏了,起不来了,需要重复执行什么的操作,

方法一:把正在运行的容器打成一个镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1、新开一个窗口操作
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76a4b880872b nginx:alpine "/docker-entrypoint.…" 22 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp funny_sinoussi

2、#把正在运行的容器打成一个镜像
[root@docker01 ~]# docker commit 76a4b880872b h5:v1

[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
h5 v1 6fcc45b1c065 51 seconds ago 89.9MB

3、把正在运行的容器删除
[root@docker01 ~]# docker rm -f $(docker ps -qa)
76a4b880872b

4、现在没有任何容器运行,将打的镜像导入
导入在本地运行:docker run -p80:80 -d h5:v1
导出到其他机器运行:
docker save h5:v1 -o /tmp/h5.tgz
scp /tmp/h5.tgz 10.0.0.102:/tmp
docker load < /tmp/h5.tgz


5、运行导入的容器
[root@docker02 ~]# docker run -p80:80 -d h5:v1

6、浏览器访问
10.0.0.102/h5_games

方法二:可以使用文件映射

5、Docker容器文件映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-v :数据卷映射 
-v :宿主机绝对路径:容器绝对路径 (常用)
-v :容器目录 #创建一个随机卷,来持久化容器的目录下的数据,适合保存变化的数据
-v :卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据,适合数据共享

1、#制作一个数据卷映射
[root@docker02 ~]# docker run --name h5 -p 80:80 -v /code/h5_games:/usr/share/nginx/html -d nginx:alpine


2、code目录会自动创建,只需要将代码解压到code目录
[root@docker02 ~]# unzip h5_games.zip -d /code/
[root@docker02 ~]# ls /code/h5_games/
ceshi game img index.html readme.txt

3、连接进去,并查看站点目录是否存在代码
[root@docker02 ~]# docker exec -it h5 /bin/sh
/ # ls /usr/share/nginx/html
ceshi game img index.html readme.txt

4、访问网页
10.0.0.102 出现小游戏的页面就映射完成

6、手动制作h5小游戏的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
1、运行一个基础镜像并连进去
[root@docker01 ~]# docker run -it centos:7 /bin/bash

2、因为使用centos镜像,里面没有nginx,需要安装nginx
[root@afc3071510f6 /]# yum -y install nginx
发现没有源

3、换源
[root@afc3071510f6 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
[root@afc3071510f6 /]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

4、优化源
[root@afc3071510f6 /]# vi /etc/yum.repos.d/CentOS-Base.repo
[updates]
....
enabled=0

5、下载nginx
[root@afc3071510f6 /]# yum -y install nginx

6、清空站点目录
[root@afc3071510f6 /]# rm -rf /usr/share/nginx/html/*

7、新开一个窗口,将解压代码上传到容器的站点目录
root@docker01 ~]# unzip h5_games.zip
[root@docker01 ~]# docker cp h5_games afc3071510f6:/usr/share/nginx/html

8、容器查看代码上传成功,并把代码移动到站点目录
[root@afc3071510f6 /]# mv /usr/share/nginx/html/h5_games/* /usr/share/nginx/html/
[root@afc3071510f6 /]# ls /usr/share/nginx/html/
ceshi game h5_games img index.html readme.txt

9、启动nginx curl一下是否成功
[root@afc3071510f6 /]# nginx
[root@afc3071510f6 /]# curl 127.0.0.1

10、如果现在退出进行,这个容器就会退出,nginx就会结束,这个镜像相当于没起nginx,没有办法让这个容器起来
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afc3071510f6 centos:7 "/bin/bash" 24 minutes ago Exited (0) 8 seconds ago friendly_wozniak

11、打镜像
[root@docker01 ~]# docker commit afc3071510f6 h5_game:v2

12、运行这个镜像
[root@docker01 ~]# docker run --name h5 -p 80:80 -d h5_game:v2 /sbin/nginx -g 'daemon off;'

/sbin/nginx:nginx启动
daemon off;:卡主

13、浏览器访问网页

缺点:
1.体积太大
2.启动不方便
3.无法直接修改CMD
4.没有声明端口

image-20240903185831846