目录

  • 一. 什么是Docker?
  • 二. Docker安装
  • 三. Docker常用命令
  • 四. Docker常用服务
  • 1. mysql服务
  • 2. redis服务
  • 3. nginx服务
  • 五. Dockerfile使用


一. 什么是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内存数据持久化

  1. aof持久化; redis服务器将所有redis客户端的写操作以命令方式记录到日志文件中
  2. 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

  1. 下载对应版本找到配置文件 进行修改 使用完整配置文件启动
  2. 创建指定文件名称直接修改需要的属性即可
  3. 上传配置文件到宿主机指定目录: 我们指定/root/rediscnfig/redis.conf
  4. 启动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
  1. 实现反向代理 负载均衡
// 拷贝文件
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
  1. nginx服务器
docker run -p 8081:80 -d --restart=always --name nginx02 -v /root/html:/usr/share/nginx/html nginx1.19.10
  1. 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一样, 都是在指定容器启动程序及其参数