文章目录
Docker
一. Docker的概述
1. Docker为什么会出现
虚拟机: 在window中装一个Vmware 通过这个软件我们可以虚拟出来或者多台电脑 笨重
----本质上也是一种虚拟化技术 Docker容器也是一种虚拟化技术
2. Docker能干什么
虚拟技术的缺点:
- 资源占用十分多
- 冗余步骤多
- 启动慢
容器化技术:
- 容器化技术不是模拟的一个完整的操作系统
- 传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作系统上安装和运行软件
- 容器内的应用直接运行在 宿主机的内核 容器是没有自己的内核的 不用虚拟硬件 轻便
- 每个容器间是互相隔离 每个容器内都有一个属于自己的文件系统 互不影响
Docker的优点:
- 应用更快速的交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
3. Docker的组成
镜像(Image):
Docker的镜像就好比是一个模板 通过这个模板来创建容器服务
tomcat镜像=>Run=>tomcat01容器(提供服务)
通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(Container):
Docker利用容器技术 独立运行一个或一组应用 ----通过镜像来创建
可以把这个容器理解为一个简易的 Linux系统
仓库(Repository):
仓库就是存放镜像的地方
分为公有仓库和私有仓库
Docker Hub----默认是国外的
阿里云等也支持(需要配置镜像加速)
4. Docker的运行流程
5. Docker的底层原理
Docker是怎么工作的?
Docker是一个Client-Server 结构的系统 Docker的守护进程运行在主机上 通过Socket从客户端访问
DockerServer接受到Docker-Client 的指令 就会执行这个命令
Docker为什么比VM快
-
Docker有着比虚拟层更少的抽象层
-
Docker利用的是宿主机的内核,VM需要的是Guest OS
所以说 新建一个容器的时候 Docker不需要像虚拟机一样重新加载一个操作系统内核
避免引导 虚拟机是加载Guest OS —分钟级别 而Docker是利用宿主机的操作系统 省略
了这个复杂过程 —秒级
二. Docker的常用命令
1. 镜像命令
docker images ---查看docker 镜像
[root@hdzs-zhuji ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 12 months ago 13.3kB
####解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
###命令可选项
[root@hdzs-zhuji ~]# docker images --help
-a, --all 显示全部
-q, --quiet 只显示镜像ID
docker search 搜索镜像
[root@hdzs-zhuji ~]# docker search mysql
NAME DESCRIPTION STARS(收藏数) OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13210 [OK]
mariadb MariaDB Server is a high performing open sou… 5050 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 630 [OK]
percona Percona Server is a fork of the MySQL relati… 586 [OK]
bitnami/mysql Bitnami MySQL Docker Image 77 [OK]
####可选项
--filter=STARS=3000
###筛选收藏数大于3000的
[root@hdzs-zhuji ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13210 [OK]
mariadb MariaDB Server is a high performing open sou… 5050 [OK]
####镜像下载
docker pull xxx (默认就是下载最新)
docker pull xxx:版本 (指定版本下载)====推荐使用
####镜像的卸载
docker rmi -f xxxx ---镜像id -f就是全删 id id 可以多删
docker rmi -f $(docker images -qa) ---所有镜像文件全删
###删除镜像大有玄机###
1.docker rmi 镜像ID
2.docker rmi -f 镜像ID
3.docker rmi 镜像仓库名:tag
2. 容器命令
说明: 我们有了镜像才可以创建容器 Linux 下载一个centos 镜像来测试学习
docker pull centos
新建容器并启动
docker run [参数] 镜像
###参数说明
--name="名称" 容器名字 例如tomcat01 tomcat02 tomcat03
-d 后台方式运行
-it 使用交互方式运行 进入容器查看内容
-p 小p 指定容器的端口 8080:8080
-p ip:主机端口:容器端口
-p 主机端口映射容器端口 --常用 xxx:xxx
-p 容器端口
-P 大p 随机指定端口
开始测试
##下载一个centos 镜像
docker pull centos --下载
[root@hdzs-zhuji ~]# docker run -it centos /bin/bash ##运行并进入
[root@86c89d8f0f3c /]# ---成功进入
[root@86c89d8f0f3c /]# ls ---它就是一个小型服务器
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@86c89d8f0f3c /]# exit ---退出
###
exit ---这是直接退出 容器会关闭
ctrl + P + Q ---容器不停止退出
查看哪些在运行中的容器
[root@hdzs-zhuji ~]# docker ps ###查看正在运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@hdzs-zhuji ~]# docker ps -a ###查看历史运行记录
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86c89d8f0f3c centos "/bin/bash" 5 minutes ago Exited (0) 27 seconds ago quizzical_gauss
7ff70fc643cf hello-world "/hello" 46 minutes ago Exited (0) 46 minutes ago funny_bhaskara
6d3fca38f081 hello-world "/hello" 47 minutes ago Exited (0) 47 minutes ago sweet_pascal
c3543080d146 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago suspicious_maxwell
[root@hdzs-zhuji ~]#
####可带参数
docker ps -a -n=1 1就是查看最近一个启动的
-q 只显示编号
###删除容器
docker rm 容器id 不能删除正在运行的容器 如果强制删除就 rm -f
docker rm $(docker ps -aq) 删除全部
###容器的启停
docker start 容器id --启动
docker restart 容器id --重启
docker stop 容器id --停止
docker kill 容器id --强制杀掉
3. 常用的其他命令
后台启动容器
#docker run -d 镜像名
例 docker run -d centos
#这时使用docker -ps 发现centos停止了
###原因###
docker 容器使用后台运行 就必须要有一个前台进程 docker发现没有应用 就会自动停止
查看日志
###查询日志
docke logs -tf xxxx ---容器的id 显示全部
docke logs -tf --tail 10 xxxx ---容器的id 10--就是显示最近10条
查看容器的进程
###容器进程查询
docker top xxxx --容器的进程id
查看镜像的元数据
docker inspect xxx --容器的进程id
进入当前正在运行的容器
第一种:
docker exec -it 容器id /bin/bash
第二种:
docker attach 容器id
##区别
docker exec ---进入容器后开启一个新的终端 在里面操作
docker attach ---进入容器正在执行的终端
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的的主机路径
查看Docker容器的内存消耗
###查看容器的内存消耗
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f426762ca2bb tomcat01 0.36% 126.2MiB / 1.695GiB 7.27% 60.1kB / 796kB 2.11MB / 0B 30
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f426762ca2bb tomcat01 0.06% 126.2MiB / 1.695GiB 7.27% 60.1kB / 796kB 2.11MB / 0B 30
三. Docker镜像的加载原理
核心: UnionFS(联合文件系统)
Docker镜像的下载都是一层一层的下载
UnionFS(联合文件系统)是一种分层 ,轻量级并且高性能的文件系统 它支持对文件系统的修改,作为一次提交来一层层的叠加 同时可以将不同目录挂载到同一个虚拟文件系统下
Union文件系统是Docker镜像的基础
镜像可以通过分层来进行继承 基于基础镜像(没有父镜像) 可以制作各种具体的应用镜像
特性: 一次同时加载多个文件系统 但从外面看起来 只能看到一个文件系统 联合加载会把各层文件系统叠加起来
这样最终的文件系统包含所有底层的文件和目录
特点:
Docker镜像都是只读的 当容器启动时 一个新的可写层就会被加到镜像的顶部
这一层就是我们通常说的容器层 容器之下就叫镜像层
四. 如何提交一个自己的镜像
1. Commit镜像
docker commit 提交容器成为一个新的副本
##命令和git原理类似
docker commit -m "提交的描述信息" -a "作者" 目标镜像名
测试
- 启动一个Tomcat
- 发现原始的Tomcat并不完整
- 配置webapps
- 将操作后的容器通过commit 提交为一个新的镜像 后面就可以直接使用新的镜像了
###具体操作###
[root@hdzs-zhuji ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f426762ca2bb b8e65a4d736d "catalina.sh run" 3 hours ago Up 3 hours 0.0.0.0:3355->8080/tcp, :::3355->8080/tcp tomcat01
[root@hdzs-zhuji ~]# docker commit -a="wblx" -m="add webapps" f426762ca2bb tomcat-02-wblx:1.0
sha256:549a30ec0573f054f8fd9ac2dc3a4db961457c571188754e948bce8ad3af1594
[root@hdzs-zhuji ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-02-wblx 1.0 549a30ec0573 15 seconds ago 685MB ---明显比较大
tomcat 9.0 b8e65a4d736d 9 months ago 680MB
[root@hdzs-zhuji ~]#
五. 容器数据卷
1. 什么是容器数据卷
Docker的理念:将应用和环境打包成一个镜像
数据—如果都在容器里面 那么我们容器删除 数据就会丢失!!!
-----------如何解决数据的持久化问题 例如我用Docker装了Mysql 当Mysql容器被删了 那么数据也就丢失了
解决方案: 容器之间可以有一个数据共享技术 Docker容器产生的数据 同步到本地
这就是卷技术 目录的挂载 将我们容器内的目录 挂载到Linux上面
总结: 容器的持久化和同步操作! 容器间还可以数据共享
2. 使用数据卷
方式一:
直接使用命令来挂载 -v 文件映射 -p 端口映射
docker run -it -v 主机目录:容器内目录
###开始
# 映射并启动进入centos
docker run -it -v /home/test/:/home/ centos /bin/bash
、
[root@hdzs-zhuji home]# ll
total 0
drwx------ 2 mysql mysql 83 Sep 19 19:56 mysql
drwxr-xr-x 2 root root 20 Sep 23 17:52 test --test自动创建
[root@hdzs-zhuji home]#
#######
[root@4f70f2355622 home]# vi 23.txt --写个文件
[root@4f70f2355622 home]# ls
12.txt 23.txt
[root@4f70f2355622 home]#
####
-rw-r--r-- 1 root root 4 Sep 23 17:52 12.txt
-rw-r--r-- 1 root root 5 Sep 23 17:57 23.txt --自动同步了!
[root@hdzs-zhuji test]#
#####
映射路径下双方同步 新增 删除 修改的操作
##查看容器信息
docker inspect 4f70f2355622
#########
"Mounts": [ ##挂载信息
{
"Type": "bind",
"Source": "/home/test", #主机内
"Destination": "/home", #容器
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
好处:容器内的文件可以在外面进行修改了
3. 具名和匿名挂载
##匿名挂载
###启动 -v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx
[root@hdzs-zhuji ~]# docker volume
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
##查看所有volume的情况
[root@hdzs-zhuji ~]# docker volume ls
DRIVER VOLUME NAME
local 74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
local e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
[root@hdzs-zhuji ~]#
##########
这就是匿名挂载 我们-v的时候 没有去写容器外的路径 只是写了容器内的
##具名挂载
##通过具名挂载 我们可以方便的找到我们的卷 --推荐使用
##我们通过 -v 卷名:容器路径 给它取了名字 这就是具名挂载
[root@hdzs-zhuji ~]# docker run -d -P --name nginx02 -v wblx:/ect/nginx nginx
b9a093d3d674fdea5f4daccdadd307961ae9c97fb7462df5e71204fba95f23ac
[root@hdzs-zhuji ~]# docker volume ls
DRIVER VOLUME NAME
local 74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
local e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
local wblx ----这就是我们刚加的
####查看卷的位置
docker volume inspect 卷名
[root@hdzs-zhuji ~]# docker volume inspect wblx
[
{
"CreatedAt": "2022-09-23T23:55:50+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/wblx/_data", --具体的路径
"Name": "wblx",
"Options": null,
"Scope": "local"
}
]
注意:
我们发现 docker容器的卷 在没有指定目录的情况下 都是在 /var/lib/docker/volumes/xxxx/_dada 这个目录下
[root@hdzs-zhuji volumes]# cd /var/lib/docker/volumes/
[root@hdzs-zhuji volumes]# ll
total 24
drwx-----x 3 root root 19 Sep 23 23:44 74d93e94ed8256758f664ed87f5e32eb3b750e4223fa78cb5a90cf48f9f56684
brw------- 1 root root 253, 3 Sep 22 15:58 backingFsBlockDev
drwx-----x 3 root root 19 Sep 23 23:47 e4a1034e9c6f23433cb6fcebddae14c5b4c320f7709783001356d13f6ea1f881
-rw------- 1 root root 32768 Sep 23 23:55 metadata.db
drwx-----x 3 root root 19 Sep 23 23:55 wblx
[root@hdzs-zhuji volumes]#
具名挂载和匿名挂载的区别
###具名挂载###
-v 名字:/容器内路径/
###匿名挂载###
-v /容器内路径/
###指定挂载###
-v /外部路径/:/容器内路径/
扩展:
###权限的设置####
:ro ---只能读取 带上了这个 那么文件就只能在外部(宿主机)上进行修改了 里面没权限了
:rw ---默认 可读可写
docker run -d -P --name nginx02 -v wblx:/ect/nginx:ro nginx
docker run -d -P --name nginx02 -v wblx:/ect/nginx:rw nginx
4. Dockerfile
1. 什么是Dockerfile
Dockerfile 就是用来构建Docker 镜像的构建文件 命令脚本
脚本的讲解
-
左边的指令都是大写的
-
VOLUME [“volume-test01”,“volume-test02”] 这其实就是一个匿名挂载
当启动后容器内会自动创建这两个文件夹
当热我们的宿主机也会生成一个映射文件
可以通过 docker inspect 容器id 去查看
###编写一个Docker 脚本
vim Dockerfile
####内容######
FROM centos
VOLUME ["volume-test01","volume-test02"]
CMD echo "=======end======"
CMD /bin/bash
###执行脚本###
[root@hdzs-zhuji docker-dockerfile]# docker build -f Dockerfile -t ddzs/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume-test01","volume-test02"]
---> Running in 31832eba621a
Removing intermediate container 31832eba621a
---> cf1197e9b44a
Step 3/4 : CMD echo "=======end======"
---> Running in 1b70a9b25afe
Removing intermediate container 1b70a9b25afe
---> 981654c3cbd5
Step 4/4 : CMD /bin/bash
---> Running in 73b1f5ed27f6
Removing intermediate container 73b1f5ed27f6
---> 9c3ef7a2b422
Successfully built 9c3ef7a2b422
Successfully tagged ddzs/centos:1.0
[root@hdzs-zhuji docker-dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ddzs/centos 1.0 9c3ef7a2b422 22 seconds ago 231MB
tomcat-02-wblx 1.0 549a30ec0573 23 hours ago 685MB
nginx latest 605c77e624dd 8 months ago 141MB
mysql 5.7 c20987f18b13 9 months ago 448MB
centos latest 5d0da3dc9764 12 months ago 231MB
[root@hdzs-zhuji docker-dockerfile]#
###当我们进入就会发现 容器以及建了新的文件夹
[root@hdzs-zhuji docker-dockerfile]# docker run -it 9c3ef7a2b422 /bin/bash
[root@6967974fbf83 /]# ls -al
total 0
drwxr-xr-x 1 root root 48 Sep 23 17:01 .
drwxr-xr-x 1 root root 48 Sep 23 17:01 ..
-rwxr-xr-x 1 root root 0 Sep 23 17:01 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Sep 23 17:01 dev
drwxr-xr-x 1 root root 66 Sep 23 17:01 etc
drwxr-xr-x 2 root root 6 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 6 Nov 3 2020 media
drwxr-xr-x 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x 114 root root 0 Sep 23 17:01 proc
dr-xr-x--- 2 root root 162 Sep 15 2021 root
drwxr-xr-x 11 root root 163 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Sep 23 17:01 sys
drwxrwxrwt 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x 12 root root 144 Sep 15 2021 usr
drwxr-xr-x 20 root root 262 Sep 15 2021 var
drwxr-xr-x 2 root root 6 Sep 23 17:01 volume-test01 ###通过脚本进行
drwxr-xr-x 2 root root 6 Sep 23 17:01 volume-test02 ###
####查看挂载的详情####
#找到了我们新建的volume-test01 volume-test02 在宿机的映射路径#
docker inspect 6967974fbf83
"Mounts": [
{
"Type": "volume",
"Name": "e055a495e81e2a32a626acf6d492263e6d3dfbcb0c3b9dc1ef7154e5b1431a22",
"Source": "/var/lib/docker/volumes/e055a495e81e2a32a626acf6d492263e6d3dfbcb0c3b9dc1ef7154e5b1431a22/_data",
"Destination": "volume-test01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "75e879033df77be549d7c79268e7128f635a8e34f00638a8fa91a8b3de4807e0",
"Source": "/var/lib/docker/volumes/75e879033df77be549d7c79268e7128f635a8e34f00638a8fa91a8b3de4807e0/_data",
"Destination": "volume-test02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
5. 数据卷容器
#####测试####
##先启动一个父容器## 9c3ef7a2b422 镜像id
docker run -it --name docker01 9c3ef7a2b422
##启动一个容器来继承这个父容器##
##--volumes-from 父容器名称##
docker run -it --name docker02 --volumes-from docker01 9c3ef7a2b422
##我们发现新启动的镜像也有了这个volume-test01 volume-test02文件##
[root@hdzs-zhuji docker-dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3557deac2ef7 9c3ef7a2b422 "/bin/sh -c /bin/bash" About a minute ago Up About a minute docker02
1a52196089b3 9c3ef7a2b422 "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes docker01
[root@hdzs-zhuji docker-dockerfile]# docker attach 3557deac2ef7
[root@3557deac2ef7 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume-test01 volume-test02
##测试##
#进入父容器 docker01 并创建了一个 test-wblx#
##########################################
docker01 这个我们就称之为 数据卷容器!!!!!!!
##########################################
[root@hdzs-zhuji docker-dockerfile]# docker attach 1a52196089b3
[root@1a52196089b3 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume-test01 volume-test02
[root@1a52196089b3 /]# cd volume-test01/
[root@1a52196089b3 volume-test01]# mkdi
mkdict mkdir
[root@1a52196089b3 volume-test01]# mkdir test-wblx
[root@1a52196089b3 volume-test01]# ls
test-wblx
[root@1a52196089b3 volume-test01]#
##进入子容器docker02##
#数据自动同步给了 docker02 # #互通共享#
[root@hdzs-zhuji docker-dockerfile]# docker attach 3557deac2ef7
[root@3557deac2ef7 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume-test01 volume-test02
[root@3557deac2ef7 /]# cd volume-test01/
[root@3557deac2ef7 volume-test01]# ls
test-wblx
[root@3557deac2ef7 volume-test01]#
#这个用的是刚才脚本构建的一个centos#
#默认是带匿名挂载的# 我们在本地进行新增 发现也是同步了!!
[root@hdzs-zhuji docker-dockerfile]# cd /var/lib/docker/volumes/333445d5797aa6721f71aaea01fc5e03683d61242bf58b1dd36d3fb038626f03/_data
[root@hdzs-zhuji _data]# ll
total 0
[root@hdzs-zhuji _data]# cd /var/lib/docker/volumes/855777f785adb8d2b1c0c5ab5e772ee5b82248ba90d53adfc67c29fb0b13ccc0/_data
[root@hdzs-zhuji _data]# ll
total 0
drwxr-xr-x 2 root root 6 Sep 24 01:32 test-wblx
[root@hdzs-zhuji _data]# mkdir 0111
[root@hdzs-zhuji _data]# ll
total 0
drwxr-xr-x 2 root root 6 Sep 24 02:00 0111
drwxr-xr-x 2 root root 6 Sep 24 01:32 test-wblx
[root@hdzs-zhuji _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3557deac2ef7 9c3ef7a2b422 "/bin/sh -c /bin/bash" 35 minutes ago Up 35 minutes docker02
1a52196089b3 9c3ef7a2b422 "/bin/sh -c /bin/bash" 40 minutes ago Up 40 minutes docker01
[root@hdzs-zhuji _data]# docker attach 3557deac2ef7
[root@3557deac2ef7 volume-test01]# ls
0111 test-wblx
注意:
数据卷的共享是一个拷贝的概念 即我们删除了任意一个容器 剩下的共享容器内的文件不会被删除
同理如果有 -v 映射到本地 那么跟本地也是互通的
案例:实现Mysql的数据共享
六. DockerFile详解
Dockerfile 是用来构建docker镜像的文件 --命令参数脚本
1. 构建步骤
- 编写一个dockerfile 文件
- dockerfile build构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像 (DockerHub 阿里云镜像仓库)
很多官方镜像包都是基础包 没啥功能
2. 编写Docker基础知识
-
每个保留关键字(指令)都必须是大写字母
-
从上到下顺序执行
-
表示注释
-
每一个指令都会创建提交一个新的镜像层 并提交
3. Dockerfile指令说明
FROM #基础镜像 一切从这里开始构建
MAINTAINER #镜像是谁写的 一般都是姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤 例如添加tomcat镜像 添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动时需要执行的命令 只有最后一个会生效 可被替代
ENTRYPOINT #指定这个容器启动时需要执行的命令 可以追加
ONBUILD #当构建一个被继承 DockerFile 这个时候就会执行ONBUILD 指令
COPY #类似ADD 将文件拷贝镜像中
ENV #构建的时候设置环境变量 例如 mysql密码
Docker Hub 中99% 镜像都是从这个基础镜像过来的 FROM scratch 然后配置需要的软件和配置来进行构建
4. 查看构建历史
docker history xxx镜像id
CMD #指定这个容器启动时需要执行的命令 只有最后一个会生效 可被替代
ENTRYPOINT #指定这个容器启动时需要执行的命令 可以追加
例如我在脚本上编写 CMD ["ls","-a"]
那么当我进入容器的时候就会正常执行这个
如果在启动命令上加了 -l
docker run xxx -l 理想情况是 docker run xxx -ls-al 但是这个-l 就会替换"ls","-a"
我们可以使用
ENTRYPOINT
ENTRYPOINT ["ls","-a"]
如果在启动命令上加了 -l
docker run xxx -l 那么就是 == docker run xxx -ls-al 追加概念
七. 发布自己的镜像
1. 通过DockerHub
-
先登录
##### docker login -u xxx用户 ##### [root@hdzs-zhuji test]# docker login -u hdzs Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@hdzs-zhuji test]#
-
提交
##注意镜像的名字 需要 作者名称/镜像名 docker tag id xxx:xxx 这种方式修改 [root@hdzs-zhuji .docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hdzs/wblxtomcat 1.0 3bbc46dbce36 3 hours ago 1.04GB [root@hdzs-zhuji .docker]# docker push hdzs/wblxtomcat:1.0 The push refers to repository [docker.io/hdzs/wblxtomcat] a8c3bae70234: Pushing [=> ] 1.337MB/42.22MB e733ee274ce5: Pushing [> ] 1.102MB/67.05MB c2300b2f51a5: Pushing [> ] 524.8kB/289.2MB 57aa96055b91: Pushing [=> ] 585.2kB/27.19MB 92ee41e6a5dc: Pushing [==================================================>] 20.48kB 07c3e38c92d2: Waiting aa93e9bd4166: Waiting 72f4cf7fe69f: Waiting 7838270baa49: Waiting 74ddd0ec08fa: Waiting
2. 通过阿里云
-
登录阿里云
-
找到容器镜像服务
-
创建命名空间
-
创建容器镜像
https://cr.console.aliyun.com/cn-beijing/instance/repositories
https://cr.console.aliyun.com/repository/cn-beijing/hedong-docker/hedong-hdzs/details
八. Docker网络
1. Linux外部为什么可以联通容器网络
原理:
-
我们每启动一个docker容器,docker就会给docker容器分配一个ip 我们只要安装了docker,就会有一个网卡docker0
桥接模式 使用的技术是 evth-pair 技术
我们发现 容器带来的网卡 内外是成对出现的 —这就是evth-pair 技术.
evth-pair 就是一对虚拟设备接口 他们都是成对出现的 一端连着协议 一端彼此相连
正因为有这个特性 那么我们就用 evth-pair 充当一个桥梁 连接各种虚拟网络设备
保障了我们内部与外部的通信 当然各个容器之间也是互通的
- Docker中所有的网络接口都是虚拟的 虚拟的转发效率高(内网传递文件)
- 只要容器删除 对应的网桥 对就没了
2. 容器互联 --link
当我们知道了 容器之间其实是可以互联的 但是ip确是每次重启随机分配的
那么当我们两个容器需要稳定连接该怎么办
–link 解决
–link本质上就是 我们在hosts里面增加了一个 172.18.0.3(随机分配ip) 的映射
但是 这个已经不使用了!
现在都采用 自定义网络的方式
3. 自定义网络
-
查看所有的docker网络
# docker network ls# [root@hdzs-zhuji .docker]# docker network ls NETWORK ID NAME DRIVER SCOPE e63c61792a98 bridge bridge local 189f8ad6551a host host local f9370eb1acef none null local [root@hdzs-zhuji .docker]#
-
网络模式
bridge ---- 桥接 docker 搭桥
none — 不配置网络
host ---- 和宿主机共享
container ---- 容器网络联通 (用得少)
-
注意
#在我们之前启动命令 其实--net bridge 就是一个默认值 这个就是我们的docker0 docker run -d -P --name tomcat01 --net bridge tomcat #docker0 特点 默认:域名不能访问 --link 可以打通 麻烦! ####开始自定义##### ## --driver bridge 桥接模式 --subnet 192.168.0.0/16 子网 192.168.0.2 - 192.168.255.255 --gateway 192.168.0.1 网关 mynet 叫啥名 ## [root@hdzs-zhuji .docker]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet a1686e9689a0536e1d3c9b966fe3887480be222c9df05b0dc9c0f723e0c2e737 [root@hdzs-zhuji .docker]# docker network ls NETWORK ID NAME DRIVER SCOPE e63c61792a98 bridge bridge local 189f8ad6551a host host local a1686e9689a0 mynet bridge local ---成功 f9370eb1acef none null local [root@hdzs-zhuji .docker]#
查看配置的网络详情 – docker network inspect mynet
开始测试
##将服务搭建到自己配置的网络上来##
##
--net mynet 指定我创建的网络
##
docker run -d -P --name centos-net-01 --net mynet centos
docker run -d -P --name centos-net-02 --net mynet centos
###查看网络详情###
docker network inspect mynet
[root@hdzs-zhuji ~]# docker run -it -P --name centos-net-01 --net mynet centos
[root@2b6fc28a88b3 /]# [root@hdzs-zhuji ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b6fc28a88b3 centos "/bin/bash" 11 seconds ago Up 10 seconds centos-net-01
[root@hdzs-zhuji ~]# docker run -it -P --name centos-net-02 --net mynet centos
[root@2f65df2e23d7 /]# [root@hdzs-zhuji ~]# ll
total 0
[root@hdzs-zhuji ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f65df2e23d7 centos "/bin/bash" 20 seconds ago Up 19 seconds centos-net-02
2b6fc28a88b3 centos "/bin/bash" 37 seconds ago Up 36 seconds centos-net-01
[root@hdzs-zhuji ~]# docker exec -it 2b6fc28a88b3 /bin/bash
######我们发现容器1 可以ping 通容器2 的随机ip 了########
[root@2b6fc28a88b3 /]# 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.186 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.064 ms
^C
######同时我们发现容器1 可以ping 通容器2 容器名 没用 --link ########
[root@2b6fc28a88b3 /]# ping centos-net-02
PING centos-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.076 ms
^C
--- centos-net-02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2027ms
rtt min/avg/max/mdev = 0.074/0.080/0.090/0.007 ms
[root@2b6fc28a88b3 /]#
好处: 例如
redis 设置192.161.0.0
mysql 集群搭建等 设置192.162.0.0 来保证集群网络互通
4. 网络联通
我们知道例如 192.161.0.0 内的网络是互通的
但是192.161.0.0和192.162.0.0 的网络就可能没法直接联通
这时候我们就需要打通网络 ----连接一个容器到网络
####将需要打通的容器 切换到自定义网络组
docker network connect mynet centos-xxx-01
####这就是 一个容器两个ip 地址####