Docker学习笔记
Docker为什么会出现?
传统的开发过程中,开发者在本地开发应用,然后由运维部署到服务器上; 在这个过程中,开发环境和服务器环境是相对独立的。 例如:开发人员在本地搭建了mysql、nginx等。运维人员也需要在服务器上安装相应的应用,相当于不同的环境不同的人做了相同的事情。
docker就是为了解决这样子的痛点出现,docker的核心思想是隔离,docker可以做到应用跟环境一起打包成镜像,运维只需要拉取对应的镜像就能 直接运行,不需要单独再配置环境。
Docker安装前的准备
1,查看centos环境
# 查看指令 uname -r
#系统内核是3.10以上的[root@xianxin ~]# uname -r3.10.0-957.21.3.el7.x86_64[root@xianxin ~]#
#系统版本[root@xianxin ~]# cat /etc/os-releaseNAME="CentOS Linux"VERSION="7 (Core)"ID="centos"ID_LIKE="rhel fedora"VERSION_ID="7"PRETTY_NAME="CentOS Linux 7 (Core)"ANSI_COLOR="0;31"CPE_NAME="cpe:/o:centos:centos:7"HOME_URL="https://www.centos.org/"BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"CENTOS_MANTISBT_PROJECT_VERSION="7"REDHAT_SUPPORT_PRODUCT="centos"REDHAT_SUPPORT_PRODUCT_VERSION="7"[root@xianxin ~]#
Docker正式安装流程
1,卸载旧的版本
# 1,首先卸载旧的版本sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2,安装需要的安装包
sudo yum install -y yum-utils
3,设置镜像库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo# 建议安装阿里云镜像sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4,更新软件包索引
## centos7sudo yum makecache fast## centos8sudo yum makecache
5,安装docker docker-ce 社区 ee 企业版
sudo yum install docker-ce docker-ce-cli containerd.io
6,启动docker
sudo systemctl start docker
7,判断启动成功
docker version
8,启动 hello-world 程序
sudo docker run hello-world
9,查看下载的hello-world镜像
# 指令 docker images[root@xianxin ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest d1165f221234 5 months ago 13.3kB
10,卸载Docker
sudo yum remove docker-ce docker-ce-cli containerd.io
11,删除Docker资源
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
Docker底层原理
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker常用命令
systemctl start docker
# 启动dockersystemctl restart docker
# 重启dockersystemctl stop docker END
# 关闭docker#########################################################
docker version # 显示docker的版本信息,验证docker是否启动成功docker info
# 显示docker的系统信息,包括镜像和容器的数量
dockers --help # 帮助命令
Docker镜像常用命令
下载镜像docker pull # 下载镜像
# 命令dokcer pull '镜像名' # 默认安装最新版本docker pull '镜像名:tag' # 安装指定版本# 例如安装mysqldocker pull mysql # 默认安装最新版本dockers pull mysql:5.7 # 安装5.7版本
查看本机上所有的镜像
docker images
docker images # 查看本机上所有的镜像[root@xianxin ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest d1165f221234 5 months ago 13.3kB# 解释REPOSITORY # 镜像的仓库源TAG # 镜像的标签IMAGE ID # 镜像的IDCREATED # 镜像的创建时间SIZE # 镜像大小
可选项
- -a # 列出所有的镜像
- -1 # 只显示镜像id
- 查看镜像的元数据
# 命令docker inspect 镜像id# 测试[root@xianxin ~]# docker inspect 300e315adb2f[ { "Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", "RepoTags": [ "centos:latest" ], "RepoDigests": [ "centos@sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1" ], "Parent": "", "Comment": "", "Created": "2020-12-08T00:22:53.076477777Z", "Container": "395e0bfa7301f73bc994efe15099ea56b8836c608dd32614ac5ae279976d33e4", "ContainerConfig": { "Hostname": "395e0bfa7301", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20201204", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, "DockerVersion": "19.03.12", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20201204", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, "Architecture": "amd64", "Os": "linux", "Size": 209348104, "VirtualSize": 209348104, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/merged", "UpperDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/diff", "WorkDir": "/var/lib/docker/overlay2/8d7dcac9c3afb69c977767c56526d927646354bcc5b0b8c8eac119dfd2fb98a4/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } }][root@xianxin ~]#
搜索镜像
docker search # 搜索镜像
[root@xianxin ~]# docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11281 [OK] mariadb MariaDB Server is a high performing open sou… 4280 [OK]
可选项
- --filter # 根据条件筛选
例如:
# 筛选点赞数超过5000的mysql镜像[root@xianxin ~]# docker search mysql --filter=STARS=5000NAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11281 [OK] [root@xianxin ~]#
删除镜像
docker rmi -f 镜像id # 删除指定的镜像docker rmi -f 镜像id 镜像id # 删除多个镜像docker rmi -f $(docker images -aq) # 删除全部的镜像
Docker容器常用命令
说明:有镜像才能创建容器,先下载一个centos镜像来学习
docker pull centos
创建容器并启动
docker run [option] images
可选参数:
- -d # 以后台方式运行
- -it # 使用交互方式运行,并进入容器查看内容
- -p # 指定容器端口,例如 -p 8080:8080 (宿主机端口8080映射容器8080端口)-p # ip:主机端口:容器端口-p # 主机端口:容器端口(常用)-p # 容器端口
- -P # 大写P随机指定端口
# 测试并进入容器docker run -it centos /bin/bash
退出容器,返回到宿主机
# 指令exit # 直接停止容器并且退出ctrl+p+q # 容器不停止退出
列出运行的容器
docker ps [option]
可选项:
- docker ps # 默认列出当前正在运行的容器
- -a # 列出当前正在运行的容器+历史运行过的容器
- -n # 列出最近创建的容器数,例如 -n=5
- -q # 只显示容器的编号id
- 启动和停止容器的操作
docker start 容器id # 启动容器docker restart 容器id # 重启容器docker stop 容器id # 停止当前正在运行的容器docker kill 容器id # 强制停止当前容器
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器docker rm -f $(docker ps -aq) # 删除所有的容器docker ps -a -q |xargs docker rm # 删除所有的容器
进入正在运行的容器
方式一
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置docker exec -it 容器id bashShell# 测试[root@xianxin ~]# docker run -it centos /bin/bash[root@9d09131b4a00 /]# [root@xianxin ~]# [root@xianxin ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9d09131b4a00 centos "/bin/bash" 15 seconds ago Up 14 seconds admiring_kalam[root@xianxin ~]# docker exec -it 9d09131b4a00 /bin/bash[root@9d09131b4a00 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@9d09131b4a00 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 13:33 pts/0 00:00:00 /bin/bashroot 15 0 0 13:36 pts/1 00:00:00 /bin/bashroot 30 15 0 13:36 pts/1 00:00:00 ps -ef[root@9d09131b4a00 /]#
方式二
docker attach 容器id# 测试 [root@xianxin ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9d09131b4a00 centos "/bin/bash" 7 minutes ago Up 7 minutes admiring_kalam[root@xianxin ~]# docker attach 9d09131b4a00[root@9d09131b4a00 /]#
两种方式比较说明
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)docker attach # 进入容器正在执行的终端,不会启动新的进程。
从容器内拷贝文件到宿主机上
# 命令docker cp 容器id:容器内的路径 目标主机路径# 测试[root@9d09131b4a00 /]# lsbin etc isxch.txt lib64 media opt root sbin sys usrdev home lib lost+found mnt proc run srv tmp var[root@xianxin ~]# docker cp 9d09131b4a00:/isxch.txt / # 从容器内复制 isxch.txt 到宿主机上[root@xianxin /]# lsbin dev home lib lost+found mnt patch root sbin sys tmp varboot etc isxch.txt lib64 media opt proc run srv test_xianxin usr www[root@xianxin /]#
查看日志
docker logs --helpdocker logs -f -t --tail 容器id
注意事项说明
# 命令 docker run -d 镜像名[root@xianxin ~]# docker run -d centos6128514eba8c01903f51b8e8cd14104e91450b3cf844f4af661f3ca029fc1974# 问题 docker ps 发现 centos 停止了# 常见的坑:docker 容器使用后台运行,就必须有一个前台进程,docker发现没有应用,就会自动停止# nginx , 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
插件安装
apt-get update# 安装pingapt install iputils-ping# 安装 vimapt-get install vim
如何提交一个自己的镜像
commit镜像
指令# 创建指令docker commit [option]# 查看镜像指令docker inspect imagesId
参数
- -m # 镜像备注
- -a # 作者信息
- 举例
# 列出当前镜像列表[root@xianxin ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 300e315adb2f 8 months ago 209MB# 启动一个镜像[root@xianxin ~]# docker run --name mycentos -it 300e315adb2f /bin/bash[root@24c4081a5e1a /]# [root@xianxin ~]# # 查看当前运行的镜像[root@xianxin ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES24c4081a5e1a 300e315adb2f "/bin/bash" 26 seconds ago Up 25 seconds mycentos# 制作提交镜像[root@xianxin ~]# docker commit -m="我的第一个centos" -a="xianxin" 24c4081a5e1a firstcentos:1.0sha256:ff755542b89ffe661ec7c8fb0344778d5de031648993bd2eed10ccd31dccec37# 重新列出镜像列表 firstcentos 镜像是刚刚提交生成的[root@xianxin ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEfirstcentos 1.0 ff755542b89f 7 seconds ago 209MBcentos latest 300e315adb2f 8 months ago 209MB[root@xianxin ~]# # 查看镜像源信息[root@xianxin ~]# docker inspect ff755542b89f[ { "Id": "sha256:ff755542b89ffe661ec7c8fb0344778d5de031648993bd2eed10ccd31dccec37", "RepoTags": [ "firstcentos:1.0" ], "RepoDigests": [], "Parent": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", # 刚刚提交的备注信息 "Comment": "我的第一个centos", "Created": "2021-08-20T15:06:27.218260388Z", "Container": "24c4081a5e1abca783b03beba1e85da3cfeeef8288a7ece2683a4ef977ee4d90", "ContainerConfig": { "Hostname": "24c4081a5e1a", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "300e315adb2f", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20201204", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, "DockerVersion": "20.10.8", # 提交的作者名字 "Author": "xianxin", "Config": { "Hostname": "24c4081a5e1a", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "300e315adb2f", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20201204", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, "Architecture": "amd64", "Os": "linux", "Size": 209348104, "VirtualSize": 209348104, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/merged", "UpperDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/diff", "WorkDir": "/var/lib/docker/overlay2/cbc7534f7bc964221b67b34abf008cbb91ab09848e22e35d76c5ddc11e209ffa/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859" ] }, "Metadata": { "LastTagTime": "2021-08-20T23:06:27.224406777+08:00" } }][root@xianxin ~]#
容器数据卷的使用
什么是容器数据卷?实际就是虚拟机与宿主机之间的数据挂载
# 命令docker run -it -v 主机目录:容器目录# 测试# 列举镜像[root@xianxin home]# docker images REPOSITORY TAG IMAGE ID CREATED SIZEfirstcentos 1.0 ff755542b89f 45 minutes ago 209MBcentos latest 300e315adb2f 8 months ago 209MB# 创建容器 宿主机/home/volume文件夹内容跟容器内的虚拟机/home/test数据是同步的[root@xianxin home]# docker run -it --name test -v /home/volume:/home/test ff755542b89f /bin/bash# 容器创建成功 并进入列出文件[root@af7fd7d1e78e /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@af7fd7d1e78e /]# cd home[root@af7fd7d1e78e home]# lstest[root@af7fd7d1e78e home]# cd test# 进入test文件夹创建test.txt[root@af7fd7d1e78e test]# touch test.txt[root@af7fd7d1e78e test]# lstest.txt# 退出回到主机[root@af7fd7d1e78e test]# [root@xianxin home]# [root@xianxin home]# lsadmin redis volume www[root@xianxin home]# cd volume/#进入/home/volume文件夹 查看文件 此时容器内部创建的文件已经同步到宿主机对应挂载目录上[root@xianxin volume]# lstest.txt[root@xianxin volume]#
删除单个数据卷或删除全部数据卷的命令如下:
删除单个数据卷
要删除单个数据卷,可以使用以下命令:
docker volume rm <volume_name>
例如,要删除名为 my_volume
的数据卷,可以使用:
docker volume rm my_volume
删除全部未使用的数据卷
要删除所有未使用的数据卷(即没有被任何容器挂载的卷),可以使用以下命令:
docker volume prune
这个命令会提示你确认是否要删除所有未使用的卷:
WARNING! This will remove all local volumes not used by at least one container.Are you sure you want to continue? [y/N]
输入 y
确认删除。
强制删除所有数据卷
如果你想强制删除所有数据卷,可以使用以下命令,这样不会有确认提示:
docker volume rm $(docker volume ls -q)
这个命令会删除所有列出的卷,但要注意,这样会删除所有数据卷,包括正在使用的卷,可能导致数据丢失。请谨慎使用。
总结:
- 删除单个数据卷:docker volume rm <volume_name>
- 删除未使用的数据卷:docker volume prune
- 强制删除所有数据卷:docker volume rm $(docker volume ls -q)
匿名挂载、具名挂载、指定路径挂载
挂载指令-v 容器内路径 # 匿名挂载-v 卷名:容器内路径 # 具名挂载-v /宿主机路径:容器内路径 # 指定路径挂载# 测试docker run -d -p:8088:80 --name testnginx -v /etc/nginx nginx:latest# 挂载成功后 查看卷的情况(罗列出挂载卷) 指令docker volume ls# 查看卷挂载在具体的位置 指令docker volume inspect 生成的卷名# 注意事项 只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的ro # 只读rw # 可读可写# 测试docker run -d -p:8088:80 --name testnginx -v /etc/nginx:ro nginx:latest
匿名挂载
匿名挂载就是没有指定在主机的挂载路径也没有命名卷名
# 指令 -v 容器内的路径[root@xianxin volume]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEfirstcentos 1.0 ff755542b89f About an hour ago 209MBnginx latest dd34e67e3371 3 days ago 133MBcentos latest 300e315adb2f 8 months ago 209MB# 运行挂载nginx测试 [root@xianxin volume]# docker run -d -p:8088:80 --name testnginx -v /etc/nginx nginx:latest5c7ffb2dd44a67e9d687b9c062f5632059dca34001985f1af53e4d9777ee153e# 启动成功 查看卷名[root@xianxin volume]# docker volume lsDRIVER VOLUME NAMElocal 5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1local 712dd7d0b8dcffc04b48962129074a526122bff3c1f4340150ade77c57f68335local ffa6bb562be59d9ca9a70512bd811aeca337dd824ebbc88154f8e7560482fa6e# 查看卷挂载的路径[root@xianxin volume]# docker inspect 5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1[ { "CreatedAt": "2021-08-19T21:55:05+08:00", "Driver": "local", "Labels": null, # 这里就是卷挂载的位置 "Mountpoint": "/var/lib/docker/volumes/5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1/_data", "Name": "5bc2df27ecfec1a069e3a9668e137dcc230b3ceef61823cdaf3d0f5353c12bf1", "Options": null, "Scope": "local" }]
浏览器访问主机8088端口:
具名挂载
具名挂载就是给挂载卷起一个名字
# 指令 -v 卷名:容器内的路径[root@xianxin /]# docker run -d -p 8089:80 --name testnginx02 -v hanvename:/etc/nginx nginx:latest4b0102acaad11de4318990a21d8d83f45d459ea55a3367f3a8c45e950c7c528c# 查看卷名< hanvename >挂载的目录[root@xianxin /]# docker volume inspect hanvename[ { "CreatedAt": "2021-08-21T00:22:45+08:00", "Driver": "local", "Labels": null, # 卷< hanvename >挂载的位置 "Mountpoint": "/var/lib/docker/volumes/hanvename/_data", "Name": "hanvename", "Options": null, "Scope": "local" }][root@xianxin /]#
指定路径挂载
指定路径挂载就是指定挂载在宿主机的指定目录
docker run -d -p 8090:8080 --name testnginx03 -v /home/test:/etc/nginx nginx:latest
小结
- 只要挂载成功,挂载文件夹数据变动,两边都是保持一致;
- 删除容器,容器内的数据是会随着容器删除的,但是挂载在宿主机上的数据还会保留;
安装mysql
# 获取镜像docker pull mysql:5.7# 官方使用方法docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 启动数据挂载到本地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:5.7
初步认识Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件命令脚本,先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个一个命令,每一个命令都是一层
1,创建一个dockerfile文件,名字可以随机,建议命名为dockerfile
文件内容及参数如下,指令需要大写
# 在home目录下新建dockerfile文件[root@xianxin home]# vim dockerfile# 文件的内容如下FROM centosVOLUME ['volume01','volume02']CMD echo '---end---'CMD /bin/bash# 这里的每个命令都是镜像的一层
# 此时文件夹已经生成dockerfile文件[root@xianxin home]# lsadmin dockerfile redis test volume www# 执行 build 构建命令[root@xianxin home]# docker build -f /home/dockerfile -t newcentos:1.0 .# 注意命令的最后面需要以点号 . 为结尾# 下面为构建解析过程Sending build context to Docker daemon 44.03kBStep 1/4 : FROM centos ---> 300e315adb2fStep 2/4 : VOLUME ['volume01','volume02'] ---> Running in 9738df348b5cRemoving intermediate container 9738df348b5c ---> c62819a0113bStep 3/4 : CMD echo '---end---' ---> Running in ae4ee1194b38Removing intermediate container ae4ee1194b38 ---> e56f8d85ae2dStep 4/4 : CMD /bin/bash ---> Running in f5fe795647e2Removing intermediate container f5fe795647e2 ---> 725692f3be89Successfully built 725692f3be89Successfully tagged newcentos:1.0# 构建打包 newcentos:1.0 成功,已经在镜像列表可以查看[root@xianxin home]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnewcentos 1.0 725692f3be89 21 seconds ago 209MBfirstcentos 1.0 ff755542b89f 17 hours ago 209MBnginx latest dd34e67e3371 3 days ago 133MBcentos latest 300e315adb2f 8 months ago 209MB
DockerFile指令
FROM # 基础镜像,一切从这里开始构建MAINTAINER # 镜像是谁写的,一般格式为,姓名+邮箱RUN # 构建镜像的时候需要运行的命令ADD # 步骤:添加内容,如添加tomcat镜像WORKDIR # 镜像的工作目录VOLUME # 挂载的目录EXPOSE # 保留端口配置CMD # 指定这个容器启动的时候要运行的命令,只有最有一个会生效,可被代替ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 指令COPY # 类似ADD,将我们的文件拷贝到镜像中ENV # 构建的时候设置环境变量
发布镜像
发布到DockerHub注册dockerhub账号
1,地址 https://hub.docker.com 注册自己账号;
2、注册成功后,登录账号
# 登录命令docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username[root@xianxin home]# # 登录命令 docker login -u username -p password[root@xianxin home]# docker login -u *** -p ***WARNING! Using --password via the CLI is insecure. Use --password-stdin.WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-store# 提示登录成功Login Succeeded[root@xianxin home]#
3、发布镜像
# 命令docker push 镜像#测试[root@xianxin home]# docker push newcentos:1.0
4、扩展问题:修改镜像版本
# 命令docker tag 镜像id 镜像版本号# 测试[root@xianxin home]# docker tag 725692f3be89 editcentos:2.0[root@xianxin home]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEeditcentos 2.0 725692f3be89 47 minutes ago 209MBnewcentos 1.0 725692f3be89 47 minutes ago 209MBfirstcentos 1.0 ff755542b89f 18 hours ago 209MBnginx latest dd34e67e3371 3 days ago 133MBcentos latest 300e315adb2f 8 months ago 209MB[root@xianxin home]#
发布到阿里云容器服务
阿里云镜像服务上
- 登录阿里云
- 找到镜像服务
- 创建命名空间
- 创建镜像仓库
Docker 网络
理解dockers01、测试 查看本地 ip 此时发现 有三个网络
2、安装并运行一个tomcat 再次查看网络ip
# 安装并运行tomcat 然后 再次查看网络 IP[root@xianxin home]# docker run -d -P --name tomcat01 tomcatUnable to find image 'tomcat:latest' locallylatest: Pulling from library/tomcat1cfaf5c6f756: Pull complete c4099a935a96: Pull complete f6e2960d8365: Pull complete dffd4e638592: Pull complete a60431b16af7: Pull complete 4869c4e8de8d: Pull complete 9815a275e5d0: Pull complete c36aa3d16702: Pull complete cc2e74b6c3db: Pull complete 1827dd5c8bb0: Pull complete Digest: sha256:1af502b6fd35c1d4ab6f24dc9bd36b58678a068ff1206c25acc129fb90b2a76aStatus: Downloaded newer image for tomcat:latestd9dfd057081469b8ccc4ffc7c3180590b2c422c9cdab39675544a6adbb950264# 从新查看网络ip[root@xianxin home]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:04:90:14 brd ff:ff:ff:ff:ff:ff inet 172.22.45.71/18 brd 172.22.63.255 scope global dynamic eth0 valid_lft 313872318sec preferred_lft 313872318sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:e6:6d:c4:52 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever# 安装运行后 这个是多出来的网络45: vethd3b4a7d@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether a2:a1:ff:82:9a:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0[root@xianxin home]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd9dfd0570814 tomcat "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:49153->8080/tcp tomcat01# 进入正在运行的 tomcat01 容器 并查看容器 ip[root@xianxin home]# docker exec -it d9dfd0570814 /bin/bashroot@d9dfd0570814:/usr/local/tomcat# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever# 回到主机 并 ping 容器id[root@xianxin home]# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.052 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.049 ms64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.051 ms64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.058 ms64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.050 ms64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.050 ms# 发现主机是可以ping容容器的
3、再次安装一个tomcat02 再重新查看网络
[root@xianxin home]# docker run -d -P --name tomcat02 tomcatde6e8535396971635bb5ba00ef3ab6b63ff14684077d1bfec3c77c5ac0c65413[root@xianxin home]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:04:90:14 brd ff:ff:ff:ff:ff:ff inet 172.22.45.71/18 brd 172.22.63.255 scope global dynamic eth0 valid_lft 313870826sec preferred_lft 313870826sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:e6:6d:c4:52 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever45: vethd3b4a7d@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether a2:a1:ff:82:9a:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0# 这里是新多出来的网络51: veth6a2310a@if50: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fa:d8:3e:9e:27:29 brd ff:ff:ff:ff:ff:ff link-netnsid 1[root@xianxin home]# # 查看tomcat02容器网络ip[root@xianxin home]# docker exec -it de6e85353969 /bin/bashroot@de6e85353969:/usr/local/tomcat# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever50: eth0@if51: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft foreverroot@de6e85353969:/usr/local/tomcat# # 容器tomcat02 ping 容器 tomcat01root@de6e85353969:/usr/local/tomcat# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.087 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.082 ms64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.070 ms64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.090 ms64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.084 ms# 发现容器tomcat02 是可以 ping通 tomcat01的
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的是veth-pair技术
小扩展
# 我们发现这个容器带来网卡,都是一对对的# evth-pair就是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连# 因为有这个特性,evth-pair充当一个桥梁,链接各种需牛网络设备# OpenStac,Docker容器之间的连接,OVS的链接,都是使用evth-pair技术
绘制一个网络图
结论
tomcat01和tomcat02是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认可用ip
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker
容器互联 --link
创建一个tomcat03 并设置链接 tomcat02
[root@xianxin home]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESde6e85353969 tomcat "catalina.sh run" 34 minutes ago Up 34 minutes 0.0.0.0:49155->8080/tcp tomcat02d9dfd0570814 tomcat "catalina.sh run" 59 minutes ago Up 59 minutes 0.0.0.0:49153->8080/tcp tomcat01# 创建一个tomcat03 并设置链接 tomcat02[root@xianxin home]# docker run -d -P --name tomcat03 --link tomcat02 tomcatfdf1db72367a23814480df6b4cf83cb19e0703f702fb140a94f6b9f80908413f# 进入tomcat03 并直接 ping tomcat02 是可以直接ping通的[root@xianxin home]# docker exec -it tomcat03 ping tomcat02PING tomcat02 (172.17.0.3) 56(84) bytes of data.64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.112 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.083 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.068 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.080 ms
tomcat03 能直接ping通tomcat02其实是在本地配置了tomcat02的配置
[root@xianxin home]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESfdf1db72367a tomcat "catalina.sh run" 12 minutes ago Up 12 minutes 0.0.0.0:49156->8080/tcp tomcat03de6e85353969 tomcat "catalina.sh run" 48 minutes ago Up 48 minutes 0.0.0.0:49155->8080/tcp tomcat02d9dfd0570814 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:49153->8080/tcp tomcat01# 进入tomcat03 查看配置[root@xianxin home]# docker exec -it fdf1db72367a cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.3 tomcat02 de6e85353969172.17.0.4 fdf1db72367a[root@xianxin home]#
本质探究
--link 就是我们在hosts配置中增加了一个 172.17.0.3 tomcat02 de6e85353969
我们现在玩Docker已经不建议使用 --link了!
自定义网络
查看所有的docker网络
# 命令docker network ls# 测试[root@xianxin ~]# docker network lsNETWORK ID NAME DRIVER SCOPE5f24c676e10f bridge bridge localbc8730852967 host host locala6534f0ad4fb none null local[root@xianxin ~]#
网络模式
bridge : 桥接docker(默认)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络互通! (用的少,局限很大)
网路连通
docker基础容器中bash: vi: command not found问题解决
我们在创建基础容器之后,进入容器,进行编辑配置文件的时候,需要使用vim或者vi命令,但是会出现
bash: vim: command not found
这是因为vim没有安装。
解决:
使用如下命令安装:
apt-get updateapt-get install vim
然后就可以了
Docker Compose
官方介绍
定义、运行多个容器
所有环境都可以使用Compose
三步骤:
1,Dockerfile 保证我门的项目在任何地方运行
作用:批量容器编排
Compose是Docker官方开源项目,需要安装!
安装Compose
查看容器IP
# 查看容器Iddocker inspect 容器ID或容器名