基于业务开发使用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库;
当client 通过pull命令去Docker daemon拉取镜像image时,首先查看images中存不存在对应的镜像, 如果服务端没有, 那么就会去Docker REgistry镜像仓库中拉取一个image镜像到本地(如果仓库中没有,那么通过命令buid创建一个镜像),然后通过run命令创建容器
先有镜像、再有容器、一个镜像可以运行为多个容器;
阿里云配置镜像加速
由于DockerHub是外国网站、很容易访问失败、可配置加速器;
- 我们可以借助阿里云的镜像加速器,登录阿里云(https://cr.console.aliyun.com/#/accelerator)
- 进入/etc/docker
- 创建或者更新daemon.json
vim daemon.json
{
“registry-mirrors”: [“https://m9r2r2uj.mirror.aliyuncs.com”]
}
- 重启服务
systemctl daemon-reload
systemctl restart docker
Docker常用命令
镜像常用命令
- 查看本地镜像
docker images
- 搜索镜像
docker search java
index : 仓库地址
name: 仓库名+ 名称
starts : 用户点赞数量
official: 是否为官方,ok则代表官方, 放心使用;
UTOMATED : 基于公开的dockerfile支撑的。
- 拉取镜像
docker pull java:8
4. 查看本地所有镜像
docker images
5. 删除镜像
docker rmi repository:tag
6. 删除所有镜像
docker rmi $(docker images -q);
容器常用命令
通过docker run创建容器;
- 运行容器
docker run -d -p 81:80 nginx
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
– ip:hostPort:containerPort
– ip::containerPort
– hostPort:containerPort
– containerPort
–net选项:指定网络模式,该选项有以下可选参数:
–net=bridge:默认选项,表示连接到默认的网桥。
–net=host:容器使用宿主机的网络。
–net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
–net=none:不配置该容器的网络,用户可自定义网络配置。
2. 查看容器
docker ps
参数
-a 查出所有镜像、包括停止的
-f, 用于过滤条件、key-val形式查询
-n, 查出最近几个运行的容器
-l, 查出所有最新版本的容器
-q, 只显示容器ID
-s, 多显示容器大小
[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
- 停止容器
普通停止: docker stop 容器ID
强制停止: docker kill 容器ID
4. 启动/重启
启动: docker start 容器ID
重启: docker restart 容器ID
- 删除容器
删除已经停止的容器: docker rm 容器ID
删除正在运行的容器: docker rm -f 容器ID
6. 查看容器日志
docker logs IMAGE_ID
-
拉取hello-world镜像
-
运行镜像
-
查看日志;
- 进入容器
docker exec -it IMAGE_ID /bin/bash
- 容器内安装vim、ping、ifconfig等指令
apt-get update
apt-get install vim #安装vim
apt-get install iputils-ping #安装ping
apt-get install net-tools #安装ifconfig
- 查看容器所有信息
docker inspect IMAGE_ID
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进不去、先贴个图;