开发人员写的代码会接触到好几个环境:开发环境、测试环境、生产环境
- docker是一个开源的应用容器引擎
- 诞生于2013年初,基于go 语言
- docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何linux机器上
- docker容器是使用沙箱机制,相互隔离
- 容器性能开销极低
- docker从17.3版本后分为CE(社区版)和EE(企业版)
docker是一种容器技术,解决软件跨环境迁移的问题
docker可以运行在Mac、Windows、CentOS、UBUNTU等操作系统,本文安装介绍在CentOS 7上
docker官网
# 1、yum包更新到最新 yum update # 2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、设置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4、安琥脏docker,出现输入界面都按 y yum install -y docker-ce # 5、查看docker版本,验证是否安装成功 docker -v1.3、docker架构
- 镜像(Image):docker容器相当于一个root文件系统
- 容器(Container):镜像与容器的关系,就像面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
- 仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢,一般都会配置镜像加速器
-
阿里云(加速器地址每个人是不同)
-
操作文档
-
安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce -
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6e2gza2z.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、docker命令
2.1、docker服务相关的命令
# 启动docker服务 systemctl start docker # 停止docker服务 systemctl stop docker # 重启docker服务 systemctl restart docker # 查看docker服务状态 systemctl status docker # 开机启动docker服务 systemctl enable docker2.2、docker镜像相关的命令
# 查看镜像(本地) docker images docker images -q # 查看所有镜像ID # 删除镜像(本地) docker rmi 镜像ID docker rmi `docker images -q` # 删除所有本地镜像 # 搜索镜像(远程) docker search 镜像名称 # 拉取镜像(远程) docker pull 镜像名称 # 下载最新版本 docker pull 镜像名称 :5.0 # 指定下载的版本号2.3、docker容器相关的命令
# 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有的容器
# 创建并启动容器
docker run 参数
- 参数说明:
-i : 交互式操作
-t : 终端
-d : 后台模式运行,容器创建后,docker exec 进入容器;退出容器后,容器不会关闭
-it : 交互式容器,容器创建后自动进入;退出容器后,自动关闭
-id : 守护式容器
--name : 为创建的容器命名
# 进入容器
docker exec 参数 # 此命令退出容器,容器不会关闭
# 启动容器
docker start 容器名称
# 停止容器
docker stop 容器名称
# 删除容器
docker rm 容器名称 # 删除前需要先停止容器
# 查看容器状态
docker inspect 容器名称
3、docker容器数据卷
3.1、数据卷的概念及作用
-
概念
- 数据卷是宿主机中的一个目录或者文件
- 当容器目录和数据卷目录绑定后,对方的修改会同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
-
作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
创建启动容器时,使用 -v 参数 设置数据卷
docker run ... -v 宿主机目录:容器内目录 ... # 注意: 1. 目录必须为绝对路径 2. 如果目录不存在,自动创建 3. 可以挂载多个数据卷 # docker run -it --name=c1 -v /root/data:/root/data_container [-v /root/data2:/root/data2_container] centos:73.3、配置数据卷容器
1. 创建启动 c3 数据卷容器,使用 -v 参数 设置数据卷 docker run -it --name=c3 -v /volume centos:7 2. 创建启动 c1 c2 容器,使用 --volumes-from 参数 设置数据卷 docker run -it --name=c1 --volume-from c3 centos:7 docker run -it --name=c2 --volume-from c3 centos:74、docker应用部署 4.1、mysql部署
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供的服务端口映射到宿主机的端口上,外部机器访问宿主机的该接口,从而间接访问容器的服务
- 这种操作称为:端口映射
1. 搜索mysql镜像 docker search mysql 2. 拉取mysql镜像 docker pull mysql 3. 创建mysql目录 mkdir ~/mysql cd ~/mysql 4. 创建mysql容器,设置端口与目录映射 docker run -id -p 3306:3306 --name=mysql_5.7 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 - 参数说明: 1. -p 3306:3306 : 将容器的3306端口映射到宿主机的3306端口 2. -v /root/mysql/conf:/etc/mysql/conf.d : 将主机目录下的conf/my.cnf 挂载到容器的/etc/mysql/conf.d 3. -v /root/mysql/logs:/logs : 将主机目录下的logs目录挂载到容器的/logs 日志目录 4. -v /root/mysql/data:/var/lib/mysql : 将主机目录下的data目录挂载到容器的/var/lib/mysql目录下 5. -e MYSQL_ROOT_PASSWORD=123456 : 初始化root用户的密码 5. 进入mysql容器 docker exec -it Ljy_mysql /bin/bash 6. 登录MySQL数据库 mysql -uroot -p4.2、Tomcat部署
1. 搜索tomcat镜像 docker search tomcat 2. 拉取tomcat镜像 docker pull tomcat 3. 创建tomcat目录 mkdir ~/tomcat cd ~/tomcat 4. 创建tomcat容器,设置端口与目录映射 docker run -id --name=tomcat_lastest -p 8080:8080 -v /root/tomcat:/usr/local/tomcat/webapps tomcat - 参数说明: 1. -p 8080:8080 : 将容器的8080端口映射到宿主机的8080端口 2. -v /root/tomcat:/usr/local/tomcat/webapps : 将主机中当前目录挂载到容器的webapps5、dockerfile 5.1、docker镜像原理
- docker镜像由特殊的文件系统叠加而成
- 最低端是boorfs,并使用宿主机的bootfs
- 第二层是root文件系统的rootfs,称为base image
- 然后在往上可以叠加其他的镜像文件
- 统一文件系统技术能够将不同的层西整和成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在,在用户的角度来看,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最低层的镜像称为基础镜像
- 当一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器
镜像制作
1. 容器转为镜像 docker commit 容器id 镜像名称:版本号 docker save -o 压缩文件名称 镜像名称:版本号 docker load -i 压缩文件名称5.2、dockerfile概念及作用
- dockerfile是一个文本文件
- 包含了一条条指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 开发人员:可以为开发团队提供一个完全一致的开发环境
- 测试人员:可以直接拿开发时所构建的镜像或者提供dockerfile文件构建一个新的镜像开始工作了
- 运维人员:在部署时,可以实现应用的无缝移植
链接: Dochub网址
5.3、dockerfile关键字| 关键字 | 作用 | 备注 |
|---|---|---|
| FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
| MAINTAINER | 作者信息 | 用来标明这个dockefile谁写的 |
| LABEL | 标签 | 用来标明dockerfile的标签,可以使用Label代替Maintainer,最终都是在 docke image基本信息中可以查看 |
| RUN | 执行命令 | 执行一段命令默认是/bin/sh格式:RUN command或者RUN [“command”,“param1”,“param2”] |
| CMD | 容器启动命 令 | 提供启动容器时候的默认命令和ENTRYPOINT配合使用,格式CMD command param1 param2 或者 CMD [“command”, “param1”,“param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | build的时候复制文件到image中 |
| ADD | 添加文件 | build的时候添加文件到image中不仅仅局限于当前build上下文,可以来源 于远程服务 |
| ENV | 环境变量 | 指定build时候的环境变量,可以在启动的容器的时候通过 -e 覆盖格式ENV name=value |
| ARG | 构建参数 | 构建参数,只在构建的时候使用的参数;如果有ENV那么ENV的相同名字的 值始终覆盖arg的参数 |
| VOLUME | 定义外部可 以挂载的数 据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中启动容器 的时候使用-v绑定格式VOLUME [“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口启动容器的使用-P来绑定暴露端口格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
| WORKDIR | 工作目录 | 指定容器内部的工作目录;如果没有创建则自动创建;如果指定/使用的是绝对地址;如果不是/开头,那么是在上一条workdir的路径的相对路径 |
| USER | 指定执行用 户 | 指定build或者启动的时候,用户在RUN CMD ENTRYPONT执行的时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令;基本上没用,因为很多时候应用本身有健康监测机制 |
| ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候,当执行FROM完成之后会执行ONBUILD的命令;但是不影响当前镜像,用处也不怎么大 |
| STOPSIGNAL | 发送信号量 到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
| SHELL | 指定执行脚 本的shell | 指定RUN CMD ENTRYPOINT执行命令的时候使用的shell |
自定义centos7
要求: 1. 默认登录路径为/var 2. 可以使用vim 实现步骤: 1. 定义父镜像:FROM centos:7 2. 定义作者信息:MAINTAINER LJY 3. 执行安装vim命令:RUN yum install -y vim 4. 定义默认的工作目录:WORKDIR /usr 5. 定义容器启动执行的命令:CMD /bin/bash 6. 通过dockerfile构建镜像:docker build -f dockerfile文件路径 -t 镜像名称:版本6、docker服务编排 6.1、服务编排
按照一定的业务规则批量管理容器
6.2、docker compose 概述docker compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止。
使用步骤:
1. 利用 dockerfile 定义运行环境镜像
2. 使用 docker-compose.yml 定义组成应用的服务
3. 运行 docker-compose up 启动应用
1. Linux 上我们可以从 Github 上下载它的二进制包来使用 curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2. 设置文件可执行权限 chmod +x /usr/local/bin/docker-compose 3. 查看版本信息 docker-compose -version # 卸载时,删除文件即可 rm /usr/local/bin/docker-compose7、docker私有仓库 7.1、私有仓库的搭建
1、拉取私有仓库篌像
docker pull registry]
2、启动私有仓库容器
docker run -id --name=r eg-i stry -p 5000:5000 registry
3、打开浏览器输入地址http://私有仓库服务器ip: 5000/v2/_catalog,看到{"repositories" :[]}表示私有仓库搭建成功
4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让docker信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实"ip
{"'insecure-registries":[”私有仓库服务器ip: 5000”]}
5、重启docker服务
systemctl restart docker
docker start registry
7.2、将镜像上传至私有仓库
1. 标记镜像为私有仓库镜像 docker tag centos:7 私有仓库ip:5000/centos7 2. 上传标记的镜像 docker push 私有仓库ip:5000/centos77.3、从私有仓库拉取镜像
docker pull 私有仓库ip:5000/centos7



