本文内容基于《Spring Cloud与Docker》,周立著。
一、Docker简介
Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
二、Docker的架构
1. Docker daemon(Docker守护进程)
- Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。可通过Docker客户端与之通信。
2. Client(Docker客户端)
- Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。
3. Images(Docker镜像)
- Docker镜像是一个只读模版,它包含创建Docker容器的说明。它和系统安装光盘有点像--使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。
4. Container(容器)
- 容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。
5. Registry
- Docker Registry是一个集中存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。
- 一个Docker Registry(看作Maven仓库)可包含多个Docker仓库(看作jar包路径),每个仓库可包含多个镜像标签(看作jar包版本号),每个标签对应一个Dokcer镜像。
- Docker Registry可分为公有(Docker Hub)和私有。
三、安装Docker(Ubuntu)
1. 前提条件,系统的内核版本高于 3.10
uname -r
2. 获取最新版本的Docker安装包
wget -qO- https://get.docker.com/ | sh
3. 启动docker 后台服务
sudo service docker start
4. 测试运行hello-world
docker run hello-world
5. 镜像加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
四、Docker镜像常用命令
1. 搜索镜像
docker search
2. 下载镜像
docker pull
3. 列出镜像
docker images
4. 删除本地镜像
docker rmi
docker rmi -f $(docker images) #删除所有镜像,-f表示强制删除
5. 构建镜像
docker build
- -t:指定镜像的标签
五、Docker容器常用命令
1. 新建并启动容器
docker run
- -d:后台运行
- -p:随机端口映射
- -p:指定端口映射
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- --network:指定网络模式
- --network=bridge:默认,表示连接到默认的网桥
- --network=host:容器使用宿主机的网络
- --network=container:NAME_or_ID:告诉Docker让新建的容器使用已有容器的网络配置
- --network=none:不配置该容器的网络,用户可自定义网络配置
- --name:指定容器名称
2. 列出容器
docker ps #列出运行中的容器
docker ps -a #列出所有容器
3. 停止容器
docker stop
4. 强制停止容器
docker kill
5. 启动已停止的容器
docker start
6. 重启容器
docker restart
7. 进入容器
https://www.cnblogs.com/kevingrace/p/6656095.html
docker exec -it app1 /bin/bash
docker exec -it web1_nginx1 /bin/sh
8. 删除容器
docker rm #只能删除已停止的容器
docker rm -f $(docker ps -a -q) #删除所有容器
9. 查看容器实时日志
docker logs -f -t --tail 10 web1_nginx1
六、MySQL相关
1. 拉取镜像
docker pull daocloud.io/library/mysql:5.7.4
2. 新建并启动镜像
docker run --name mysql1 --restart=always -v /home/yeta/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -e MYSQL_ROOT_PASSWORD=root -d -p3306:3306 daocloud.io/library/mysql:5.7.4
- -v:从宿主机挂载/home/yeta/data目录至容器内作为
/var/lib/mysql
目录,那样MySQL就会默认将数据文件写入这个目录中
3. 使用 MySQL 命令行工具连接 MySQL
docker run -it --link mysql1:mysql --rm daocloud.io/library/mysql:5.7.4 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
4. 修改时区
https://www.cnblogs.com/sxdcgaq8080/p/10057385.html
set global time_zone = '+8:00';
set time_zone = '+8:00';
flush privileges;
5. 建库建表(略)
七、Spring Boot相关
https://blog.csdn.net/qq_28958301/article/details/84307113
八、Nginx相关
1. 拉取镜像
docker pull daocloud.io/library/nginx:1.13.0-alpine
2. 新建并启动镜像(托管静态网页内容)
- 方式1:映射目录和配置文件
docker run --name web1_nginx1 -v /home/yeta/projects/web1/html/:/usr/share/nginx/html:ro -v /home/yeta/projects/web1/nginx.conf:/etc/nginx/nginx.conf:ro -d -p 80:80 daocloud.io/library/nginx:1.13.0-alpine
- 方式2:利用Dockerfile基于ngix的镜像构建自己的镜像
FROM daocloud.io/library/nginx:1.13.0-alpine
COPY html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
docker build -t web1_nginx2 .
docker run --name web1_nginx2 -d -p 80:80 web1_nginx2
九、Redis相关
1. 拉取镜像
docker pull daocloud.io/library/redis:3.2.9
2. 启动容器
docker run --name redis1 -d -p 6379:6379 daocloud.io/library/redis:3.2.9
十、Dockerfile常用指令
1. ADD复制文件
- 格式:ADD docker2-0.0.1-SNAPSHOT.jar app.jar
- 从src目录复制文件到容器的dest,src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。
2. COPY复制文件
- 格式:COPY html /usr/share/nginx/html
- 和ADD类似,但不支持URL和压缩包。
3. ENV设置环境变量
- 格式:ENV JAVA_HOME /path/to/java
4. ARG设置构建参数
- 格式:ARG user1=someuser
- 类似ENV,但设置的是构建时的环境变量,在容器运行时是不会存在的。
5. CMD容器启动命令
- 格式:CMD echo "this is a test" | wc -
- 每个Dockerfile只有一个CMD命令,多个只执行最后一条。
6. ENTRYPOINT入口点
- 和CMD类似。
7. EXPOSE声明暴露的端口
- 格式:EXPOSE 8080
- 只是一个声明,运行时并不会因为该声明就打开相应端口,主要是帮助镜像使用者理解该镜像服务的守护端口,其次是当运行时使用随机映射时,会自动映射EXPOSE的端口。
8. FROM指定基础镜像
- 格式:FROM daocloud.io/library/nginx:1.13.0-alpine
- 必须指定且需要写在其他指令之前。
9. LABEL为镜像添加元数据
- 格式:LABEL version="1..0"
10. MAINTAINER指定维护者的信息
- 格式:MAINTAINER yeta<xx@qq.com>
11. RUN执行命令
- 格式1:RUN <command>
- Linux中默认是/bin/sh -c
- Windows中是cmd /s /c
- 格式2:RUN ["executable", "param1", "param2"]
12. USER设置用户
- 格式:USER 用户名
- 用于设置启动镜像时的用户或者UID,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将使用该用户执行命令。
13. VOLUME指定挂载点
- 格式:VOLUME /data
- 使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。
14. WORKDIR指定工作目录
- 格式:WORKDIR /path/to/workdir
- 切换目录指令,类似cd,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将该目录作为当前目录,并执行相应的命令。