@TOC
一. 什么是Docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
二. Docker安装
下面是一个通用的docker安装命令, 使用aliyun镜像下载
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
三. Docker常用命令
(1) 配置阿里云加速--拉取镜像时用国内的更快
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"] // 自己的镜像加速链接
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
(2) 启动docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
(3) 镜像相关命令
docker images // 查看docker镜像
docker pull tomcat // 拉取镜像 不加版本号则拉取最新版本
docker image rm 镜像名/image id // 删除没有运行过的容器
docker image rm -f 镜像名/image id // 强制删除容器
docker image -q // 查看所有容器的id
docker image tomcat -q // 查看所有tomcat容器的id
docker ps -qa // 查询所有容器的id
(4) 容器相关命令
// 运行一个容器 例如:docker run tomcat9.0
docker run 镜像名|镜像id
docker stop 镜像id|容器名称 // 停止容器
docker start 镜像id|容器名称 // 开启容器
docker restart 容器id|容器名称 // 重启容器
docker pause 容器id|容器名称 // 暂停容器
docker unpause 容器id|容器名称 // 恢复容器
docker kill 镜像id|容器名称 // 杀死容器
docker rm 容器id|容器名称 // 删除已经停止的容器
docker rm -f 容器id|容器名称 // 强制删除容器
docker rm -f $(docker ps -qa) // 删除所有容器
// 查看运行的容器
docker ps
// 查看所有的容器
docker ps -a
// docker进入容器终端, 其中数字为容器id
docker exec -it 容器id bash
// 退出容器
exit
// 查看容器内运行进程
docker top 容器id|容器名称
// 查看容器内细节指令
docker inspect 容器id|容器名称
(5) 容器日志相关命令
// OPTIONS为可添加的参数
docker logs [OPTIONS] 容器id或容器名
// 实时监控容器内的服务日志
docker logs -f 容器id或容器名
(6) 容器和宿主机之间的文件拷贝
// 将容器中指定文件和目录拷贝到宿主机
docker cp 容器id:容器中文件或目录 主机目录
// 将宿主机文件和目录拷贝到容器中
docker cp 主机目录 容器id:容器中文件或目录
(7) 容器数据卷机制
数据卷 Data Volume 用来实现容器中数据和宿主机中数据进行映射(同步)
第一次启动容器时需要指定
- 使用绝对路径设置数据卷
docker run -v 宿主机绝对路径:容器内路:ro 镜像名
docker run -d --name tmocat01 -v /root/apps:/usr/local/tomcat/webapps:ro tomcate:9.0
ro: read only 如果在设置数据卷时指定ro, 代表容器内路径是只读的
- 使用别名方式设置数据卷
docker run -v a:容器路径
docker run -v a:/usr/local/tomcat/webapps tomcat:9.0
a是docker数据卷中的别名 当这个别名在docker中存在,则直接使用, 否则自动创建, 创建的路径默认在: /var/lib/docker/volumes 使用别名方式保留容器路径原始内容, 前提别名对应路径不能存在内容
(8) 将容器打包成一个镜像
docker commit -m "webapps" -a "swei" 容器id|容器名称 镜像名:版本
-m 信息
-a 作者信息
docker commit -m "webapps" -a "swei" e77 tomcatdemo:9.0
(9) 备份镜像和恢复
- 备份镜像
docker save 镜像名: Tag -o (镜像名-tag).tar
docker save tomcat:9.0 -o /root/tomcat-9.0.tar
- 恢复镜像
docker load -i /root/tomcat-9.0.tar
四. Docker常用服务
1. mysql服务
(1) 拉取mysql
docker pull mysql:5.6
(2) 运行mysql, 首次安装mysql需要密码
docker run -d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --name mysql01 --restart=always mysql5.6
-e MYSQL_ROOT_PASSWORD=root // 指定环境密码
--resart=always // 总是运行
(3) 使用数据卷持久化数据到宿主机
docker run -d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --name mysql01 -v /root/data:/var/lib/mysql --restart=always mysql5.6
(4) 数据库备份, 利用mysql官方命令mysqldump
// 备份数据库所有的表信息
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
// 备份指定库的表
docker exec mysql容器id sh -c 'exec mysqldump --databases ems -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/ems.sql
// 备份指定库中的结构
docker exec mysql容器id sh -c 'exec mysqldump --no-data --databases ems -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/ems.sql
使用navicat可以直接导出sql表数据
2. redis服务
(1) 拉取redis
docker pull redis:5.0.12
(2) redis启动
docker run -d -p 6379:6379 --name redis01 --restart=always redis:5.0.12
(3) 进入redis服务
// 进入docker中redis的工作目录
docker exec -it e1 bash
// 进入redis服务
redis-cli
(4) redis内存数据持久化
- aof持久化; redis服务器将所有redis客户端的写操作以命令方式记录到日志文件中
- rdb持久化: 快照redis服务器将某一时刻数据以快照文件形式写入到磁盘
docker run -d -p 6379:6379 --name redis01 -v /root/redisdata:/data --restart=always redis-server --appendonly yes redis:5.0.12
--appendonly yes // 开启持久化
(5) 自定义配置文件启动redis
- 下载对应版本找到配置文件 进行修改 使用完整配置文件启动
- 创建指定文件名称直接修改需要的属性即可
- 上传配置文件到宿主机指定目录: 我们指定/root/rediscnfig/redis.conf
- 启动redis, 将配置文件映射到容器, 并且配置为持久化文件
docker run -d -p 6379:6379 --name redis01 --restart=always -v /root/rediscfig:/data redis-server /data/redis.conf yes redis:5.0.12
注意: 外部连接时, 需要将配置文件中的bind设为bind: 0.0.0.0 但是本次配置文件为完整文件, 在日常开发中, 我们并不需要完整的配置, 所以我们需要自己配置一个部分需要的配置文件
3. nginx服务
(1) 拉取nginx
docker pull nginx:1.19.10
(2) 启动nginx
docker run -p 80:80 -d --restart=always --name nginx01 nginx:1.19.10
(3) 加载指定nginx配置启动
docker run -p 80:80 -d --restart=always --name nginx01 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10
- 实现反向代理 负载均衡
// 拷贝文件
docker cp 容器id:/etc/nginx/nginx.conf /root/nginxconf
docker run -p 80:80 -d --restart=always --name nginx01 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx1.19.10
- nginx服务器
docker run -p 8081:80 -d --restart=always --name nginx02 -v /root/html:/usr/share/nginx/html nginx1.19.10
- nginx服务器和负载均衡使用
docker run -p 8081:80 -d --restart=always --name nginx02 -v /root/html:/usr/share/nginx/html -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx1.19.10
五. Dockerfile使用
Dockerfile是镜像描述文件, 通过Dockerfile文件构建一个属于自己的镜像
Dockerfile命令
保留字
作用
FROM
当前镜像是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
构建镜像时需要运行的指令
EXPOSE
当前容器对外暴露出的端口号
WORKDIR
指定在创建容器后, 终端默认登录进来的工作目录, 一个落脚点
ENV
用来在构建镜像过程中设置环境变量
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY
类似于ADD, 拷贝文件和目录到镜像中, 将从构建上下文目录中原路径的文件/目录复制到新的一层的镜像内的目标路径位置
VOLUME
容器数据卷, 用于数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令, Dockerfile中可以有多个CMD指令, 但只有最后一个生效, CMD会被docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令, ENTRYPOINT的目的和CMD一样, 都是在指定容器启动程序及其参数