在上一篇文章中已经讲了如何通过宿主机上的文件映射到容器内,解决我们经常修改配置文件频繁重启机器及配置文件统一管理的好处,那么假设我们现在要在项目中运行一个springboot项目,该怎么运行呢?首先容器内运行java项目肯定得配置java环境,如:java -jar springboot.jar,那么
Dockerfile定制镜像
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用这个脚本来构建、定制镜像,这个脚本就可以称之为Dockerfile,它是一个文本文件其中包含了一条条指令,每一条指定构建一层,因此每一条指定的内容就是描述该层应当如何构建。
创建Dockerfile规则
- 名字必须写对 Dockerfile,记住没后缀名
- 第一条命令必须是FROM(指定基础官方镜像,如nginx、tomcat、openjdk等,防止别人嵌入不安全代码)
- RUN多个命令要尽量做到简写至一个命令 如:mkdir a \ mkdir b(容器内创建) 这就是合二为一,一个命令就是一层
docker build -t 自己取得容器名字:版本号1.0 .(进入到Dockerfile文件目录下执行)
#编辑Dockerfile文件FROM openjdk:lastest #后面的:lastest可以不写 默认拉取最新的,\换行run echo 'hello' /humm/docker/readme.txt \&& run touch humm.txt #是在容器中创建&& mkdir /hummdocker
Dockerfile指令详解
我们刚才已经使用了from、run其实它还有是十多个指定
COPY 源路径(宿主机的文件路径) 目标路径(容器的目标路径)
- ADD 高级的复制命令:add与copy格式和性质基本一致但在copy的基础上增加了一些功能。比如源路径可以是个URL,这种情况下,Docker引擎会尝试下载这个连接的文件放到目标路径,下载后的文件权限为600,如果不是想要的权限那么还需要增加一层RUN进行权限调整,另外如果下载的是整个压缩包,需要解压缩,也需要额外的命令进行解压缩。所以不如直接使用run命令,然后使用weget或者curl工具下载,处理权限、解压缩、然后清理无用文件更合理,所以不推荐使用。
- CMD容器启动命令:与run命令格式类似,可以使shell格式也可以是exec格式,比如:CMD echo ‘追加内容 ‘ >> xx.txt 运行一个jar包
还有很多….,等用到了在说
删除没有启动的镜像
docker rmi $(docker images -q)docker rm 镜像仓库名:lastest 版本号
构建命令
docker build -t 镜像名:版本 .
当Dockerfile和当前执行命令的目录不在同一个时,我们也可以指定Dockerfile,执行命名之后,会看到控制台逐层输出构建内容,直到输出两个Successfully即为构建成功
docker build -t simone-getway:1.0 -f ./Dockerfile .
备注:如果使用 build 指令,在 Dockerfile 中设置的选项(例如: CMD , EXPOSE , VOLUME , ENV等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。
docker镜像服务器间复制
我们制作好镜像后,有时需要将镜像复制到另一台服务器使用。能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所以如果使用仓库的方式,只能自己搭建私有仓库。
如果我们仅仅是要复制到另外少数的服务器,搭建私有仓库显然没有这个必要,而将镜像保存为文件上传到其他服务器再从文件中载入镜像也是一个不错的选择。可以使用Docker save和Docker load命令来存储和载入镜像。
在镜像所在服务器执行如下命令:
docker save -o simone-getway simone-getway.tarscp -r ./simone-getway.tar root@192.168.1.110:/root
在目的地服务器root目录下执行如下命令:
docker load < simone-getway.tar
Compose
我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件,来定义一组关联的应用容器为一个项目。它是通过python编写,实际上调用的Docker服务提供的api来对容器进行管理
Compose中有两个概念:
- 服务:一个应用容器实际山可以包括若干个运行的相同镜像的实例
- 由一组关联的应用容器组成一个完整的业务单元
Docker for Mac 、 Docker for Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。Linux 系统需要单独使用二进制或者 pip 方式进行安装。
Compose安装与卸载
安装
在 Linux 上的安装十分简单, 从官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果慢可以换一个数据源
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
最后赋予可执行权限: chmod +x /usr/local/bin/docker-compose
卸载
如果是二进制包安装,直接删除二进制文件即可sudo rm /usr/local/bin/docker-compose
常用命令
docker-compose
version 打印compose的版本信息
config 验证 Compose 格式是否正确,若正确则显示配置,若格式错误显示错误原因
logs 查看服务器容器输出,不同服务使用不用的颜色区分
down 等于rm+stop 停止容器,并移除关联的镜像
up -d 后台启动
ps 列出项目当前所有正在运行的容器
scale 设定服务器运行的容器个数 如docker-compose scale web=3 db=2将会启动三个web服务容器和2个db服务容器
compse参数说明
commond:echo "xxx" 覆盖容器启动后默认执行的命令
container_name:xxxx-container 指定容器名称
depends_on: 解决容器依赖、启动先后问题
dns:自定义dns服务器,可以使一个值或者一个列表
environment:设置环境变量
expose:暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口参数
image:指定镜像 本地不存在则会从拉取
labels:为容器添加元数据信息,可以作为辅助说明
links:连接到其它容器,不推荐使用 应该使用docker network建立网络
network_mode:设置网络模式 如brideg、host、none
networks:配置容器连接的网络
port:暴露的端口信息,使用宿主端口:容器端口(不怕重复)
volumes:数据卷所挂载的路径
entrypoint:/xx/xx.sh 指定服务容器启动后执行的入口文件
working_dir:指定容器工作目录
restart:always指定容器退出后重启策略为始终重启,生产环境推荐always或者unless-stoppe
configs: 仅用于swarm mode 后续会学
deploy:仅用于swarm mode后续会学
compose文件支持动态读取主机的系统环境变量和当前目录下.env文件的变量
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
#创建网络
docker network create my_network
#查看创建的网络
docker network ls
#举例
version: '3'
services:
mysql-service:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
restart: always
ports:
- "3306:3306"
volumes:
- /docker-service/mysql-5.7/data:/var/lib/mysql
- /docker-service/mysql-5.7/conf:/etc/mysql/conf.d
networks:
- my_network
networks:
my_network:
external:
name: mysql_net
前端项目部署
- 生产包npm run build:prod 此时会在前端目录下产生一个dist文件夹
- 然后将文件夹上传到我们的服务器你想要存放的位置,在此文件下建立docker-compse.yml类型的文件
通常我们构建前端项目是需要把dist文件夹放在nginx的目录html下,通过映射来实现但是目前我们自身的nginx是用来专门做反向代理的,并不会用来做文件的映射,所以此时我们在编写docker-compose-simone-admin的时候就必须依赖nginx的镜像。所以前端本质上就是一个nginx服务而已,只是必须给定一个端口我这里是9527(9527是一个github上开源的admin项目)
3.docker-compose.yml编写的内容如下
version: '3.0'
services:
admin:
restart: always
image: nginx:stable-alpine # 依赖的镜像
container_name: admin-client-container #容器名称
networks:
- devops
ports:
- "9527:9527" #开放的端口
volumes:
- ./dist:/usr/share/nginx/html #挂载的前端dist文件夹
- ./conf.d:/etc/nginx/conf.d #挂载的前端nginx配置文件
networks:
devops:
name: devops
external: true
#admin.conf nginx的文件映射配置
server {
listen 9527;
server_name localhost;
#access_log logs/host_9527.access.log main;
access_log off;
location / {
root /usr/share/nginx/html; #新建docker新建的映射的路径
index index.html index.htm;
}
}

路由nginx给前端配置分配给9527的nginx配置 admin-client.conf
server {
listen 443 ssl;
server_name admin.jimusanwei.dev;
ssl_certificate /etc/nginx/ssl/_wildcard.jimusanwei.dev.pem;
ssl_certificate_key /etc/nginx/ssl/_wildcard.jimusanwei.dev-key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
client_max_body_size 50m;
#以下确保 gitlab中项目的 url 是域名而不是 http://git,不可缺少
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 反向代理到 gitlab 内置的 nginx
proxy_pass http://admin;
index index.html index.htm;
}
}
upstream admin {
# 域名对应 gitlab配置中的 external_url
# 端口对应 gitlab 配置中的 nginx['listen_port'],通过环境变量可设置
server 192.168.1.148:9527;
}
在docker-compose.yml文件所在位置启动即可 docker-compose up -d (docker-compose -down 关闭)
后端服务部署
首先你的有个springboot服务,然后给idea安装个docker的插件
- 编写Dockfile文件 ``` FROM openjdk:8u201-jdk-alpine3.9
MAINTAINER heian1158139789@qq.com
系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp
应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD target/simone-admin-1.0-SNAPSHOT.jar app.jar
启动容器时的进程
ENTRYPOINT [“java”,”-Xms256m”,”-Xmx512m”,”-jar”,”/app.jar”]
暴露10020端口
EXPOSE 10020 ```
- 填写Dockerfile其中的参数,比如填写什么镜像名称、端口映射


参考地址:https://blog.csdn.net/boling_cavalry/article/details/100051325
