Docker的基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==》run==》tomcat01容器(提供容器服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易 的linux系统
仓库(repository):
仓库就是存放镜像的地方
仓库分为共有仓库和私有仓库
Docker hub (默认是国外的)
阿里云…都有容器服务器(配置镜像加速)
安装Docker
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#环境准备 [root@localhost docker]# uname -r 3.10.0-1160.el7.x86_64 [root@localhost /]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) 第1步:卸载旧的版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 第2步:安装需要的安装包 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #官方源,国外,下咋爱素服慢 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用阿里云的源,十分的快 第3步:更新软件包索引 yum makecache fast 第4步:安装docker docker-ce 社区版 docker-ee 企业版 yum install docker-ce docker-ce-cli containrd.io 第5步:启动docker systemctl start docker 第6步:检验docker是否启动成功 docker version
1
2
3第7步:测试 docker run hello-world
1
2
3第8步:查看下载的这个hello-world镜像 docker images
docker run 的运行流程图
底层原理
Docker是怎么工作的?
Docker是一个 Client - Server 结构的系统,Docker的守护进程运行主机上,通过Sockets从客户端访问
DockerServer接收到Docker - Client的指令就会执行这个命令
Docker的常用命令
帮助命令
1
2
3
4
5
6
7docker version #显示docker的版本信息 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令
镜像命令
1
2
3
4docker images 查看所有本地的主机上的镜像 [root@localhost ~]# docker images
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
27REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB # 解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的大小 # 可选项 -a, --all #列出所有镜像 -q, --quiet #只显示镜像id
docker search 搜索镜像
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[root@localhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10949 [OK] mariadb MariaDB Server is a high performing open sou… 4139 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 813 [OK] # 可选项,通过收藏来过滤 -f, --filter=STARS=3000 -->搜索出来的镜像就是STARS大于3000的 [root@localhost ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10949 [OK] mariadb MariaDB Server is a high performing open sou… 4139 [OK]
docker pull 下载镜像
1
2
3
4
5
6[root@localhost ~]# docker pull mysql Using default tag: latest # 指定下载版本 [root@bogon ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql
docker rmi 删除镜像
1
2
3
4
5
6
7
8
9
10
11[root@bogon ~]# docker rmi mysql #删除指定的镜像 Untagged: mysql:latest [root@bogon ~]# docker rmi mysql:5.7 Untagged: mysql:5.7 # 可选项 -f, --force #强制删除 [root@bogon ~]# docker rmi -f 镜像id 镜像id # 删除多个容器 [root@bogon ~]# docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
1
2docker pull centos
新建容器并启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[root@bogon ~]# docker run [可选参数] image # 参数说明 --name="NAME" 容器名字 tomcat01 tomcat02 ,用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P 随机指定端口 # 测试,启动并进入容器 [root@bogon ~]# docker run -it centos /bin/bash [root@b515fe319a8d /]# exit # 从容器中退出
列出所有的运行的容器
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[root@bogon ~]# docker ps # 列出当前正在运行的容器 -a # 列出当前正在运行的容器+列出历史运行过的容器 -n=? #显示最近创建的容器 -q # 只显示容器的编号 [root@bogon ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72e287d72b05 centos "/bin/bash" 4 minutes ago Up 4 minutes great_keldysh [root@bogon ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b515fe319a8d centos "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago vigorous_ritchie 72e287d72b05 centos "/bin/bash" 10 minutes ago Up 10 minutes great_keldysh [root@bogon ~]# docker ps -aq b515fe319a8d 72e287d72b05 edf89af944fb
退出容器
exit # 直接容器停止并退出
Ctrl + P + Q #容器不停止退出
删除容器
1
2
3
4
5
6
7
8
9docker rm 容器id # 删除指定容器,不能删除正在运行的容器 docker rm -f $(docker ps -aq) # 删除所有的容器 [root@bogon ~]# docker ps -aq |xargs docker rm -f # 删除所有的容器 fd723f804e6b f50dbc8a302c c37db74a8e67
启动和停止容器的操作
1
2
3
4
5
6
7
8
9docker start 容器id # 启动容器 docker restart 容器id # 重新启动容器 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id # 强制停止当前正在运行的容器
其他常用命令
后台启动容器
docker run -d 镜像名
1
2
3
4# 问题 docker ps ,发现 centos停止了 #常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止 # nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25docker logs -f -t 容器id # 显示日志 -tf # 显示日志 --tail + number # 要显示的日志条数 [root@bogon ~]# docker logs -tf --tail 10 3457b7e330f3 Verifying : which-2.21-12.el8.x86_64 5/5 2021-06-04T10:29:08.722509956Z 2021-06-04T10:29:08.722532970Z Installed: 2021-06-04T10:29:08.722537236Z gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64 2021-06-04T10:29:08.722540443Z vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch 2021-06-04T10:29:08.722543744Z which-2.21-12.el8.x86_64 2021-06-04T10:29:08.722546713Z 2021-06-04T10:29:08.722551256Z Complete! 2021-06-04T10:29:13.185894309Z [root@3457b7e330f3 ~]# exit 2021-06-04T10:29:13.185932873Z exit
查看容器中进程信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19docker top + 容器id [root@bogon ~]# docker top 8da1e7e1e4f0 UID PID PPID C STIME TTY TIME CMD root 5006 4985 0 18:39 pts/0 00:00:00 /bin/bash
查看镜像的元数据
1
2
3docker inspect 容器id [root@bogon ~]# docker inspect 8da1e7e1e4f0
进入当前正在运行的容器
1
2
3
4
5
6
7
8
9
10
11
12# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置 方式1:docker exec -it 容器id bashshell [root@bogon ~]# docker exec -it 8da1e7e1e4f0 /bin/bash [root@8da1e7e1e4f0 /]# 方式2:docker attach 容器id [root@bogon ~]# docker attach 8da1e7e1e4f0 [root@8da1e7e1e4f0 /]# # docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) # docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
1
2
3
4
5
6
7
8
9
10docker cp 容器id:容器内路径 目的的主机路径 [root@localhost ~]# docker cp e8868725676c:/root/preo.txt . [root@localhost ~]# ls anaconda-ks.cfg hello.sh passwd_88 preo.txt school
Docker 安装 Nginx
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
781、搜索镜像 search 建议去docker hub上查找,可以看到帮助文档 [root@localhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 2、下载镜像 pull [root@localhost ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 69692152171a: Pull complete 30afc0b18f67: Pull complete 596b1d696923: Pull complete febe5bd23e98: Pull complete 8283eee92e2f: Pull complete 351ad75a6cfa: Pull complete Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest [root@localhost ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat d960726af2be: Pull complete e8d62473a22d: Pull complete 8962bc0fad55: Pull complete 65d943ee54c1: Pull complete da20b77f10ac: Pull complete 8669a096f083: Pull complete e0c0a5e9ce88: Pull complete f7f46169d747: Pull complete 42d8171e56e6: Pull complete 774078a3f8bb: Pull complete Digest: sha256:71703331e3e7f8581f2a8206a612dbeedfbc7bb8caeee972eadca1cc4a72e6b1 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest d1a364dc548d 12 days ago 133MB 3、运行测试 [root@localhost ~]# docker run -d --name nginx01 -p 3344:80 nginx c27bc2e98bad174982f5017907181d633c9c5484fd836eb3e62709f8a5cfc59c [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c27bc2e98bad nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 [root@localhost ~]# curl localhost:3344 # -d 后台运行 # --name 给容器命名 # -p 宿主机端口 : 容器内部端口
Docker镜像
镜像概念
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
Docker镜像加载原理
UnionFS(联合文件系统) UnionS(联合文件系统):Union文件系统(
UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的加,同时可以将不同目录挂载到同一个虛拟文件系统下(unite
several directories into a single virtual filesystem)。 Union文件系统是
Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理 docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。 bootfs(boot
file system) 主要包含bootloader和kernel,bootloader
主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在
Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin
,/etx 等标准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
对于安装虚拟机的压缩包都是很大的,而Docker的镜像却很小
分层理解
这样最大的好处就是资源共享,例如很多个镜像都从相同的 Base 镜像构建而来,而宿主机只需要在磁盘上保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像,这样就可以为所有的人容器服务了,而且镜像的每一层都可以被共享
理解
所有的 Docker镜像都起始于一个基础镜像层,进行修改或增加新的内容时,就会在当前的镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外屐示为统一的文件系统
Linux上可用的存储引擎有AUFS、 Overlay2、 Device Mapper、Btfs以及ZFS 。顾名思义,每种存储引擎都基于 Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在 Windows上仅支持 windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW。
下图展示了与系统显示相同的三层镜像。所有镜像层堆并合并,对外提供统一的视图
特点
Docker镜像都是只读的,当容器启动时新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器之下的都叫镜像层commit镜像
如何提交一个自己的镜像?
docker commit 提交容器成为一个新的副本
1
2
3# 命令和git原理类似 docker commit -m="提交的描述信息" -a="提交的人" 容器id 目标镜像名 : [TAG]
实战测试
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、启动一个默认的tomcat [root@bogon ~]# docker run -d -p 8080:8080 tomcat /bin/bash [root@bogon ~]# docker exec -it 7c3ded83d209 /bin/bash # 2、进入tomcat之后发现这个默认的tomcat是没有webapps应用 [root@bogon ~]# docker exec -it 7c3ded83d209 /bin/bash root@7c3ded83d209:/usr/local/tomcat# ls webapps # 3、自己拷贝进去了基本的文件 root@7c3ded83d209:/usr/local/tomcat# cp -r webapps.dist/* webapps root@7c3ded83d209:/usr/local/tomcat# ls webapps ROOT docs examples host-manager manager # 4、将我们操作过的容器通过commit 提交成为一个新的镜像,就可使用我们修改过的镜像,这就是我们自己完善过的镜像 [root@bogon ~]# docker commit -a="hangcheng.lu" -m="add webapps app" 7c3ded83d209 tomcat02:1.0 sha256:12ffbb9631b36fbbe852684aa5cb580d869810027e0e2c2ada9fd9c9977f7243 [root@bogon ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 12ffbb9631b3 8 seconds ago 672MB
Docker网络
自定义网络
查看所有的docker网络
测试
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# 我们直接启动的命令 --net bridge,而这个就是我们的docker0 docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat # docker0 特点,默认,域名不能访问, --link可以打通连接 # 我们可以自定义一个网络 [root@bogon ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet cc9132bac77778c28edd0b37842214f4b72d51eff956635bff03950972e21112 [root@bogon ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 68dbca06b52c bridge bridge local b5b53392faaf host host local cc9132bac777 mynet bridge local 5c60c6b4da7a none null local # 查看自定义网络的配置 [root@bogon ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "cc9132bac77778c28edd0b37842214f4b72d51eff956635bff03950972e21112", "Created": "2021-06-10T10:01:42.39448638+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] # 使用自定义网络运行两个tomcat [root@bogon ~]# docker run -d -P --name tomcat02 --net mynet tomcat [root@bogon ~]# docker run -d -P --name tomcat04 --net mynet tomcat # 通过测试发现可以直接通过ping +容器名 直接ping通 [root@bogon ~]# docker exec -it tomcat02 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.193 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.149 ms 64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.117 ms 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.146 ms ^C --- 192.168.0.3 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 5ms rtt min/avg/max/mdev = 0.117/0.151/0.193/0.028 ms [root@bogon ~]# docker exec -it tomcat02 ping tomcat04 PING tomcat04 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat04.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.069 ms 64 bytes from tomcat04.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.052 ms 64 bytes from tomcat04.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.095 ms ^C --- tomcat04 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 4ms rtt min/avg/max/mdev = 0.052/0.072/0.095/0.017 ms
我们能自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
1
2
3
4redis --不同的集群使用不同的网络,保证集群是安全和健康的 mysql --不同的集群使用不同的网络,保证集群是安全和健康的
网络联通
1
2
3
4# 使用bridge桥接方式运行两个tomcat [root@bogon ~]# docker run -d -P --name tomcat01 --net bridge tomcat [root@bogon ~]# docker run -d -P --name tomcat03 --net bridge tomcat
测试打通tomcat01和mynet
1
2
3
4[root@bogon ~]# docker network connect mynet tomcat01 # 连通之后,发现就是将tomcat01放到了mynet网络下 # 一个容器,两个ip地址
容器数据卷
什么是容器数据卷?
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地
这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面。 容器的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式1:直接使用命令来挂载 -v
1
2
3
4
5
6
7
8
9实战:安装MySQL # 获取镜像 [root@bogon ceshi]# docker pull mysql # 运行容器,需要做数据卷挂载 # 安装启动MySQL需要配置密码 -e MYSQL_ROOT_PASSWORD=密码 [root@bogon ceshi]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql ebb34b7a3ca5276b9a350c9c65374e73211e5e60b517ef79928c82ad12c8f5aa # 启动成功后,我们在本地使用 sqlyog 来测试一下连接
删除容器,发现我们直接挂载到本地的数据卷依旧没有丢失,这就实现了容器数据的持久化功能
具名挂载和命名挂载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 匿名挂载 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有的 volume 的情况 docker volume ls DRIVER VOLUME NAME local 0fb7545eb09121c422feefed573e015280fc3c55b05df3a905808a38d05e1cc9 # 具名挂载 -v 卷名:容器内路径 docker run -d -P --name nginx02 -v juming:/etc/nginx nginx docker volume ls DRIVER VOLUME NAME local juming # 查看数据卷 docker volume inspect 卷名
所有的docker容器内的卷,在没有指定目录的情况下都是在 /var/lib/docker/volumes 目录下
DockerFile
DockerFile介绍
dockerfile 是用来构建docker镜像的文件。命令参数脚本
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、从上到下的执行顺序
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单
Docker镜像逐渐成为企业交付的标准,必须要掌握
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
DockerFile指令
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
27FROM # 指定基础镜像,一切从这里开始构建 MAINTAINER # 指定维护者信息,镜像是谁写的,姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 添加内容,COPY文件,会自动解压 WORKDIR # 设置当前的工作目录,即镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 指定对外的端口,保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量 RUN # 运行
创建一个自己的centos
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
711、编写DockerFile的文件 [root@bogon dockerfile]# cat mydockerfile_centos FROM centos MIANTAINER hangcheng.lu@mobvista.com ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum install vim -y RUN yum install net-tools -y EXPOSE 80 CMD echo $MYPATH CMD echo "---end---" CMD echo /bin/bash 2、通过编写好的文件构建镜像 # 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] [root@bogon dockerfile]# docker build -f mydockerfile_centos -t mycentos:1.0 . Successfully built fca2bdbf5ba3 Successfully tagged mycentos:1.0 3、测试运行 [root@bogon dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 1.0 fca2bdbf5ba3 3 minutes ago 295MB [root@bogon dockerfile]# docker run -it mycentos:1.0 /bin/bash [root@615a10c7201f local]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.6 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:06 txqueuelen 0 (Ethernet) RX packets 8 bytes 656 (656.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们可以列出本地进行的变更历史
CMD 和 ENTRYPOINT 的区别
1
2
3
4
5CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
最后
以上就是坚定店员最近收集整理的关于Docker详解的全部内容,更多相关Docker详解内容请搜索靠谱客的其他文章。
发表评论 取消回复