基于业务开发使用Docker
- Docker是一个开源的容器引擎,它有助于更快地交付应用。
- Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。
- 使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
Docker安装
- docker内核要求在3.1以上
命令 : uname -r - 安装
命令: yum -y install docker-io - 启动
命令: service docker start - 查看是否安装成功,查看版本
命令: docker version - 入门例子 安装nginx
docker run -p 80:80 -d nginx
Docker架构
- Docker daemon
Docker守护进程、用来接收客户端的命令,拉取镜像、运行镜像为容器; - Client
发送docker命令的客户端; - Images
Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序 - Container
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。 - Registry
远程镜像仓库、用来存储镜像;如果需要与他人合作、则需要将镜像放入远程镜像中心,让他人拉取; 类似远程Meven库、本地Maven库;
阿里云配置镜像加速
由于DockerHub是外国网站、很容易访问失败、可配置加速器;
- 我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator)
- 进入/etc/docker
- 创建或者更新daemon.json
- 重启服务
Docker常用命令
镜像常用命令
- 查看本地镜像
- 搜索镜像
- 拉取镜像
4. 查看本地所有镜像
5. 删除镜像
6. 删除所有镜像
容器常用命令
通过docker run创建容器;
- 运行容器
2. 查看容器
[root@centos-7 docker]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
1294465aa995 nginx "/docker-entrypoin..." 2 minutes ago Up 2 minutes 0.0.0.0:90->80/tcp suspicious_brattain 1.09 kB (virtual 141 MB)
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson 1.09 kB (virtual 141 MB)
[root@centos-7 docker]# docker ps -q
1294465aa995
b3f28f833918
[root@centos-7 docker]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
[root@centos-7 docker]# docker ps -1
unknown shorthand flag: '1' in -1
See 'docker ps --help'.
[root@centos-7 docker]# docker ps -n 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
[root@centos-7 docker]# docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 3 minutes ago Up 3 minutes 0.0.0.0:90->80/tcp suspicious_brattain
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson
[root@centos-7 docker]# docker ps -f name=tomcat
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos-7 docker]# docker ps -f name=nginx
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos-7 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1294465aa995 nginx "/docker-entrypoin..." 6 minutes ago Up 6 minutes 0.0.0.0:90->80/tcp suspicious_brattain
b3f28f833918 nginx "/docker-entrypoin..." 17 hours ago Up 17 hours 0.0.0.0:91->80/tcp loving_swanson
8a20491ddf14 nginx "/docker-entrypoin..." 17 hours ago Exited (0) 17 hours ago fervent_bhaskara
7a2f2b98ab37 registry-zqh/tiku:1.1.0 "java -jar /data/a..." 20 months ago Exited (1) 20 months ago
- 停止容器
4. 启动/重启
- 删除容器
6. 查看容器日志
-
拉取hello-world镜像
-
运行镜像
-
查看日志;
- 进入容器
- 容器内安装vim、ping、ifconfig等指令
- 查看容器所有信息
Dockerfile
使用Dockerfile构建Docker镜像
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节
先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页
- 创建空文件夹、在里面创建Dockerfile文件;
FROM nginx
RUN echo '<h1>This is zqh Nginx!!!</h1>' > /usr/share/nginx/html/index.html
- 构建镜像
docker build -t zqh:tuling .
- 运行镜像
docker run -d -p 101:80 nginx:zqh
Dockerfile常用指令
- FROM
基础镜像的来源 - RUN
构建镜像阶段执行命令,可以有多个RUN命令,执行结果会放入Image文件 - ADD 源文件 目标文件
- 将源文件复制到容器中的目标目录
- src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包
ADD <src> <dest>
-
COPY
拷贝文件,和ADD命令类似,但不支持URL和压缩包 -
CMD
- 容器启动后执行命令;
- 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
-
EXPOSE
声明容器在运行时对外提供的服务端口 -
WORKDIR
指定容器工作路径 -
ENV
指定容器环境变量 -
ENTRYPINT
容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。 -
USER
该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令 -
VOLUME
指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME[“/data”]。
构建微服务镜像
基于Eureka构建一个镜像、也可以自己打包一个SpringBoot应用;
- 创建空文件夹、在创建Dockerfile文件;
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
-
将jar包放入空文件夹下;
-
使用docker build构建镜像;
-
使用docker run运行容器;
镜像卷
有很多应用的数据是不可丢失的、例如Mysql、Redis;若是不设置挂载点、当容器关机后、数据就丢失了、导致生产事故; 而Docker通过设置挂载点、将容器的数据同步到宿主机的目录下、当容器重启时、可宿主机数据同步会容器中;
docker run -d -p 8761:8761 -v /log:/container-log microservice-eureka-server:0.0.1
JAVA_OPTS
Dockerfile中设置了${JAVA_OPTS}参数、即运行时、执行JAVA_OPTS参数可指定服务运行参数
# --cap-add=SYS_PTRACE 这个参数是让docker能支持在容器里能执行jdk自带类似jinfo,jmap这些命令,如果不需要在容器里执行这些命令可以不加
docker run -e JAVA_OPTS='-Xms1028M -Xmx1028M -Xmn512M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M' --cap-add=SYS_PTRACE -d -p 8761:8761 microservice-eureka-server:0.0.1
将微服务镜像发布到远程镜像仓库
我们制作好了微服务镜像,一般需要发布到镜像仓库供别人使用,我们可以选择自建镜像仓库,也可以直接使用docker官方镜像仓库,这里我们选择docker官方镜像仓库:https://hub.docker.com/
- 登录
需要在docke官方镜像仓库注册一个账号, 输入用户名、密码;
[root@centos-7 myapp]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (yaoyaochengxian):
Password:
Login Succeeded
- 使用docker tag 给镜像前面加个分组名(一般就是docker hub的账户名)
docker tag microservice-eureka-server:0.0.1 yaoyaochengxian/microservice-eureka-server
- 使用docker push 推送到docker hub
docker push yaoyaochengxian/microservice-eureka-server
这样就推送成功了、可以去dockerhub中查看;
由于dockerhub进不去、先贴个图;