Docker基本使用与项目部署
1.概述
1.1介绍
Docker 是一个开源的应用容器引擎, 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。也就是说会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿这个集装箱。具有隔离性,即在运行集装箱内的内容时,会在Linux的内核中, 单独的开辟一片空间, 这片空间不会影响到其他程序。
容器是完全使用沙箱机制,
1.2相关术语
注册中心:超级码头, 上面放的就是集装箱
镜像:相当于集装箱
容器:运行起来的镜像
2.下载与安装
2.1docker安装
1)下载关于docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
2)设置下载docker的镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3)安装docker
yum makecache fast
yum -y install docker-ce
4)启动
systemctl start docker
5)测试
docker run hello-world
6)设置开机启动
systemctl enable docker
7)安装完成,测试结果,看到下图说明安装成功
8)查看版本
docker -v
9)停止、重启
systemctl stop docker
systemctl restart docker
10)查看docker的状态
systemctl status docker
2.2中央仓库
国外的仓库访问很慢,我们使用国内的仓库http://hub.daocloud.io/
打开网址,搜索需要的容器,如tomcat
点击搜索的内容
选择版本后点击拉取
复制拉取命令,后面可以直接使用
3.镜像的操作
镜像id(镜像标识)也叫IMAGE ID,如果镜像id中前面一部分是唯一的,则可以使用其直接代替整个id。后面的容器id也是类似。实例如下:
可以看到只有两个镜像,对于tomcat镜像,就可以直接使用b8来代替b8dfe9ade316 ,显得非常简单。
3.1基本操作命令
1)拉取镜像到本地
命令语法:
docker pull tag
实例:拉取tomcat镜像到本地
docker pull daocloud.io/library/tomcat:8.5.15-jre8
2)查看本地全部的镜像
ducker images
3)删除本地镜像
命令语法:
docker rmi 镜像标识
实例:
docker rmi b8
4)镜像的导出
命令语法:
docker save -o 导出的路径 镜像id
实例:
docker save -o ./tomcat8.5.image b8
5)加载导出的镜像
命令语法:
docker load -i 镜像路径
实例:
docker load -i tomcat8.5.image
6)修改镜像的名称和tag
命令语法:
docker tag 镜像id 容器名称:版本
实例:
docker tag b8 tomcat:8.5
8)运行容器
命令简单语法:
docker run -d -p 宿主服务端口:容器端口 --name 容器名称 镜像标识或名称
参数分析:
-d:服务后台运行 -p 宿主服务端口:容器端口:指定映射端口。即linux对外暴露的端口:执行的容器的端口 --name 容器名称:指定容器的名称
实例1:
docker run -d -p 9001:8080 --name tomcat b8
实例2:
docker run -d -p 9001:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
两个实例,运行一个即可。启动后,在浏览器通过ip:9001来访问tomcat。这里tomcat的默认端口是8080,在指定容器的端口时也必须是8080,否则外部无法访问。tomcat是指定容器启动后的名字,是自定义是,不能重复。
实例3:
docker run tomcat
上面的两个实例是在初始化容器,指定了一些参数,而实例3是直接启动,已经启动过并停止的容器,可以使用这种方式。而且上面两个实例都是在后台运行的,还有一种方式不在后台运行
docker run --rm -p 80:80 nginx:2.0
运行容器,关闭运行后会自动删除此容器。
9)查看正在运行的容器
docker ps
可以看到下图的信息,也标注了哪个是容器id
查看所有的容器
docker ps -a
10)停止容器的运行
命令语法:
docker stop 容器id
11)重启容器
命令语法:
docker start 容器id
12)查看容器的执行日志
命令语法:
docker logs -f 容器id
13)进入容器内部
命令语法:
docker exec -it 容器id bash
14)删除容器
命令语法:
docker rm 容器id
需要注意的是,删除之前,必须先停止容器的执行。删除之后,再次执行运行容器的命令来启动容器。
15)查看版本信息
docker version
16)查看docker的详细信息
docker info
3.2安装其他的镜像
以下直接使用一行命令拉取并启动容器。
3.2.1把项目部署到tomcat
1)先把项目打成war上传到linux中
2)启动tomcat容器(如果已经启动则不操作)
3)把宿主机的文件复制到容器中
命令语法:
docker cp 文件名称 容器id:存到容器的内部路径
实例:
docker cp test.war 222a:/usr/local/tomact/webapps
3.2.2安装mysql
mysql容器启动时需要添加额外的参数,来指明mysql服务的登录名和密码。
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.6
安装之后就可以使用连接工具进行连接测试。
3.3 dcoker run参数详解
在启动镜像时,带了很多的参数,下面对常用的进行说明 :
参数名称 | 说明 | 样例 |
-d | 后台启动此容器 | |
-p | 端口映射,宿主服务端口:容器端口 | 8080:8080 |
--name | 指定启动的容器的名称,自定义 | tomcat |
-e | 设置环境变量 | MYSQL_ROOT_PASSWORD=123456 |
-v | 目录映射,宿主服务目录:容器目录 | /opt/tomcat/webapps:/usr/local/tomcat/webapps |
4.数据卷
4.1介绍
数据卷就是把宿主机的目录与容器的某一个目录进行映射。容器中的文件操作起来比较麻烦,就直接操作宿主机的文件,容器可以动态的使用这些文件。
4.2操作
1)创建数据卷
创建的数据卷默认存放在/var/lib/docker/volumes/目录下。
命令语法:
docker volume create 数据卷名称
实例:
docker volume create test
2)查看数据卷详细信息
命令语法:
docker volume inspect 数据卷名称
实例:
docker volume inspect test
3)查看全部的数据卷
docker volume ls
4)删除数据卷
命令语法:
docker volume rm 数据卷名称
实例:
docker volume rm test
5)映射数据卷
第一种:
命令语法:
docker run -v 数据卷名称:容器内部映射的路径 镜像id
实例:
docker run -v tomcat:/usr/local/tomcat/webapps b8
可以看到webapps下的文件已经复制到指定的数据卷
这种方式直接映射数据卷时,如果数据卷不存在,Docker 会自动创建,将容器内部自带的文件存储在默认的存放路径中。
第二种:
命令语法:
docker run -v 路径:容器内部映射的路径 镜像id
实例:
docker run -v /usr/bk:/usr/local/tomcat/webapps b8
映射后里面是空的
在映射时直接指定一个路径作为数据卷的存放位置,映射后这个文件夹是空的。
5.Docker-Compose
5.1介绍
解决运行镜像输入大量参数的问题,批量管理容器。只需要配置docker-compose.yml即可。
5.2下载与安装
1)下载
下载地址:https://github.com/docker/compose/releases/tag/1.24.1,也可以使用其他的版本。
2)把下载的文件复制到linux的/usr/local/bin目录下
3)修改其名称并给与操作权限
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
4)添加环境变量,可全局使用
vi /etc/profile
#在尾部追加
export PATH=$PATH:/usr/local/bin
#刷新
source /etc/profile
5)测试
在任意目录下输入
docker-compose
看到下图说明安装成功。
5.3基本配置
只需要在其目录下创建一个docker-compose.yml文件,然后输入相关配置即可。
一般会把映射的文件放在/opt目录下,因此先在/opt目录下新建一个文件夹,存放配置文件和其他文件
cd /opt
mkdir docker_mysql_tomcat
cd docker_mysql_tomcat
touch docker-compose.yml
docker-compose.yml中mysql和tomcat的配置如下,其他容器同:
version: '3.1'
services:
#服务的名字
mysql:
#只要docker,此容器也启动
restart: always
#指定镜像路径
image: daocloud.io/library/mysql:5.7.6
#设置容器名称
container_name: mysql
#设置端口号映射
ports:
- 3306:3306
environment:
#设置服务登录的密码
MYSQL_ROOT_PASSWORD: 123456
#设置时区
TZ: Asia/Shanghai
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 9001:8080
environment:
TZ: Asia/Shanghai
volumes:
- /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
在上述的配置中,environment中使用的是key: value方式,其实也可以使用列表(-和=)方式,关键代码如下:
environment: #设置服务登录的密码 - MYSQL_ROOT_PASSWORD=123456 #设置时区 - TZ=Asia/Shanghai
这两种方式都是可以的,可以相互替换。也就是说,对于凡是可以使用列表方式的地方,都可以使用key: value方式;对于凡是可以使用key: value方式的地方,都可以使用列表方式。可根据自己的想法选择。不过需要注意的是,使用key: value方式是,在冒号后面与value直角必须留一个空格。
5.4操作命令
1)启动管理的容器,需要在对应的yml目录中运行
docker-compose up -d
2)关闭并删除管理的容器
docker-compose down
3)开启(关闭stop、重启restart)已管理的容器
docker-compose start
4)查看由docker-compose管理的容器
docker-compose ps
5)查看日志
yml配置后在/opt/docker_mysql_tomcat目录执行上面的启动命令,就可以同时启动这两个容器,也是可以访问的。
6.自定义镜像Dockerfile
6.1介绍
在前面介绍了中央仓库,里面的镜像其实也有docker用户自己上传的,我们也可以自定义镜像。常用的命令如下,具体使用见后面:
命令 | 说明 |
from | 指定镜像要依赖的环境,如tomcat |
env | 设置环境变量(可设置多条) |
run | 要执行的命令(可设置多条) |
add | 把宿主机的文件复制到容器内容,如果是压缩文件会自动解压 |
copy | 同add,但是压缩文件不会自动解压 |
workdir | 设置工作目录 |
6.2使用Dockerfile自定义镜像
1)先创建一个目录,存放Dockerfile文件
cd /opt
mkdir dockerfile
2)把自己的war包放到这个目录下
我的war可以下载后使用,链接:https://pan.baidu.com/s/1Nn17bKJeaxAspfQN_wAKig 提取码:1235
3)创建Dockerfile文件,内容如下
FROM daocloud.io/library/tomcat:8.5.15-jre8
RUN rm -rf /usr/local/tomcat/webapps/*
ADD springboot.war /usr/local/tomcat/webapps
上面的命令分析:从仓库中使用tomcat镜像,然后删除webapps下面的文件,把war包放到webapps下。
4)生成镜像
docker build -t springboot:1.0 .
springboot:1.0指定自定义镜像的名称和版本号,点表示war包和Dockerfile文件是在同一目录下。
5)启动镜像
docker run -d -p 8080:8080 --name springboot 33
6)测试
在浏览器之间访问对应的路径,这里是http://192.168.101.33:8080/springboot/api/user,可以看到返回的正常数据。
6.3结合docker-compose自定义镜像
1)结合上一步的操作,在/opt/dockerfile目录下新建docker-compose.yml,内容如下
version: '3.1'
services:
#服务的名字
springboot:
#只要docker,此容器也启动
restart: always
#构建自定义镜像
build:
#设置dockerfile的路径
context: .
#指定dockerfile的名称
dockerfile: Dockerfile
#指定镜像路径,这里使用自己的镜像
image: springboot:2.0
#设置容器名称
container_name: springboot
#设置端口号映射
ports:
- 8080:8080
environment:
#设置时区
TZ: Asia/Shanghai
其中version是指定docker-compose的版本。
2)使用docker-compose启动容器。如果上一步的镜像没有停止,请先停止后再启动。
docker-compose up -d
如果需要重新构建自定义镜像,可使用下面的命令
docker-compose build
7.安装Jenkins
7.1介绍
7.2安装与运行
1)在/opt目录下新建一个文件夹,映射jenkins
mkdir docker_jenkins
2)配置docker-compose.yml
version: '3.1'
services:
jenkins:
restart: always
image: jenkins/jenkins
container_name: jenkins
ports:
- 8888:8080
- 5000:5000
volumes:
- ./data:/var/jenkins_home
3)启动运行,等待文件下载完成,查看日志发现data文件夹没有授权
docker-compose up -d
docker-compose logs -f
4)给data权限,然后再次运行后查看日志
chmod 777 data
docker-compose restart
看到下图说明运行成功
5)在浏览器访问http://192.168.1.161:8888即可看到jenkins在初始化网络,然后在登录页面输入上图中的密码
6)点击选择插件来安装
7)搜索安装必要的插件,这里安装git和publish
选择好后点击安装,会安装插件,这个过程需要一段时间,网络良好的话两个小时左右,
8)创建管理员账户
9)配置实例页面不用选择,直接下一步即可
10)进入首页,如下图
7.3配置
7.3.1配置docker集群
1)安装插件
打开系统管理->插件管理,选择可选插件后在搜索框输入docker
选择后进行安装,安装完成后需重启jenkins,同理需要安装SSH、Locale、Version Number和Maven插件。SSH是后面连接docker要用到的,Locale是中文插件,把语言切换为中文,Version Number。安装完成后需重启jenkins。
2)开启docker的2375端口,用于远程访问
打开docker的配置文件,添加参数
vi /usr/lib/systemd/system/docker.service
参数配置如图
可复制的参数
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
配置后保存,重启docker
systemctl daemon-reload
systemctl restart docker
3)配置dcoker集群
打开系统管理->系统配置,找到下图的地方,点击
选择docker详情
配置docker,点击测试,测试成功会显示版本号等信息。
7.3.2配置全局的jdk和maven
第一步:把jdk和maven的压缩包上传到linux,然后把文件都解压到/opt/docker_jenkins/data目录下,这个目录和/var/jenkins_home是映射关系(7.2中配置的)。
第二步:打开系统管理->全局工具配置,分别点击jdk安装和maven安装来配置jdk和maven,配置如下图
7.3.3添加凭据
由于后面要用到虚拟机,就先添加一个虚拟机的凭证。方法是在系统管理中,找到下图的安全凭证,
进去之后点击全局后面的三角,
添加一个凭证
保存后在系统配置中配置SSH远程主机信息,配置后点击连接进行测试。
8.jenkins+docker实现SpringBoot项目自动化部署
8.1项目准备
新建一个springboot的项目,这是使用springboot-test来创建项目,但是指定的打包名是springboot(详见源码https://github.com/zhongyushi-git/springboot-test.git),写一个简单的测试接口。然后在项目的根目录下新建一个Dockerfile的文件,内容如下
#设置tomcat镜像
FROM daocloud.io/library/tomcat:8.5.15-jre8
#删除webapps下面之前的war包
RUN rm -rf /usr/local/tomcat/webapps/*.war
#把新的war包放webapps下面
ADD target/springboot.war /usr/local/tomcat/webapps
#切换到指定目录,如果不需要修改端口号可不加这两行
#WORKDIR /usr/local/tomcat/conf/
#设置tomcat的启动端口
#RUN sed -i 's|"8080"|"9020"|' server.xml
说明:
1)/usr/local/tomcat是官方给出的tomcat容器的目录,若使用不同的tomcat镜像,请参考官网。
2)springboot.war是我定义的名称,可自定义,接着把项目推送到github上。在这个配置文件中,后两行代码是来修改tomcat的启动端口的,也就是把tomcat默认的8080端口改为9020,可根据需要进行使用。如果这里改变了端口,那么在后面的任务配置中也要做相应的修改。
3)springboot的项目有内置的tomcat,要想在外部的tomcat中部署,需要做相应的打包准备,详见https://www.cnblogs.com/zys2019/p/11945450.html#_label13。
8.2任务配置
1)选择新建任务,创建一个maven任务
2)配置源码
3)设置忽略test文件
-U clean install -DskipTests=true
如果pom.xml不是在项目的路径下,而是在下一层目录,则可写为下一层目录/pom.xml
4)配置版本规则
VERSION_NUMBER
${JOB_name}_${BUILD_DATE_FORMATTED,"yyyyMMdd"}
5)在Post Steps下点击add post-build Stepst添加构建docker镜像
springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
如果Dockerfile文件不是在当前目录下,而在docker目录下,那么上面的位置就是./docker
6)再添加一个SSH,用于打包后启动tomcat容器,如图
配置命令:
docker rm -f springboot
docker run -d -p 8080:8080 --name springboot springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
这样设置后,进行构建,版本信息显示格式是springboot_20200727.4。如果在Dockerfile文件中修改了tomcat的端口,那么这里也要做相应的修改,把容器的端口改为对应的端口
docker run -d -p 8080:9020 --name springboot springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
8.3构建测试
在上面的任务中,选择左侧的立即构建
在下面看到在构建的任务,点击进行,选择控制台输出,可以看到构建过程中的部分日志信息。构建成功后就可以直接访问项目了,虚拟机ip:8080/项目请求的路径(这里是http://192.168.159.129:8080/springboot/test)。后期使用起来就很方便了,把更新后的项目提交到github,然后进行jenkins上,点击构建即可。
8.4加入mysql服务
在前面的springboot项目中,并没有使用数据库,但是在实际开发中会用数据库,就简单介绍一下。在源码中,并没有看到mysql的使用,因为我只写了一个简单的模板,可以根据需要自行添加,下面的创建表和访问数据接口也需要自行添加。
1)在docker中新建一个目录,编写docker-compose.yml文件,配置mysql服务并启动
version: '3.1'
services:
#服务的名字
mysql:
#只要docker,此容器也启动
restart: always
#指定镜像路径
image: daocloud.io/library/mysql:5.7.6
#设置容器名称
container_name: mysql
#设置端口号映射
ports:
- 3306:3306
environment:
#设置服务登录的密码
MYSQL_ROOT_PASSWORD: 123456
#设置时区
TZ: Asia/Shanghai
2)导入mysql和mybatis等相关的坐标
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
版本控制如下:
<properties>
<druid.version>1.1.9</druid.version>
<fastjson.version>1.2.47</fastjson.version>
<mybatis.version>1.3.2</mybatis.version>
</properties>
3)编写配置文件和接口
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://172.17.0.1:3306/db2020?serverTimezone=CTT
spring.datasource.username=root
spring.datasource.password=123456
把配置文件的一部分单独拿出来,原因是ip必须是docker服务对应的ip,只有这个ip才能在本地访问容器中的mysql服务。
4)创建数据库。连接到docker中的mysql,数据库和表请自行创建。
5)测试。把项目提交到github上后进行构建,自定义的查询数据库的接口是正常的。
8.5加入redis服务
加入redis服务同mysql,在此略。
version: '3.1'
services:
redis:
restart: always
image: redis
container_name: redis
ports:
- 6379:6379
command: redis-server --requirepass 123456
environment:
TZ: Asia/Shanghai
volumes:
- ./data:/data
9.jenkins+docker实现Vue项目自动化部署
9.1项目准备
1)新建一个vue的项目,写一个简单的测试页面。然后在项目的根目录下新建一个Dockerfile的文件,内容如下
FROM nginx
COPY dist /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/nginx.conf
2)在根目录下创建一个nginx.conf,内容如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 9999;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
红色的内容可自行修改。项目源码:https://github.com/zhongyushi-git/vue-print.git
9.2任务配置
1)下载nodeJs的压缩包,然后解压到/opt/jenkins_docker/data下
2)在jenkins中安装nodeJs插件,然后重启jenkins
3)配置全局工具nodeJs
4)新建一个自由风格的软件项目
5)源码配置
6)配置版本规则
VERSION_NUMBER
${JOB_name}_${BUILD_DATE_FORMATTED,"yyyyMMdd"}
7)配置ndoeJS
在构建环境中设置nodeJS的路径
8)构建打包
配置:
echo $PATH
node -v
npm -v
npm config set registry https://registry.npm.taobao.org/
npm install
npm run build
9)构建镜像
test:${VERSION_NUMBER}.${BUILD_NUMBER}
10)启动镜像
docker rm -f test
docker run -d -p 8080:9999 --name test test:${VERSION_NUMBER}.${BUILD_NUMBER}
11)构建测试
在上面的任务中,选择左侧的立即构建,构建成功后就可以测试,页面能正常访问。
10.常见问题
10.1 Bind for 0.0.0.0:80 failed: port is already allocated
这个问题的意思就是容器占用的port还没有完全释放。
查看进程,发现相关的容器并没有在运行,而 docker-proxy 却依然绑定着端口:
docker ps
查看被docker-proxy占用的端口
ps -aux | grep -v grep | grep docker-proxy
停止 doker 进程,删除所有容器,然后删除 local-kv.db 这个文件
service docker stop
docker rm $(docker ps -aq)
rm /var/lib/docker/network/files/local-kv.db
service docker start
10.2 Jenkins时区设置为北京时间
打开 【系统管理】->【脚本命令行】运行下面的命令
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
10.3如何进行jenkins容器内部
docker exec -it jenkins bash
如果需要进入其他容器内部,只要把jenkins换成对应的容器名称或容器id即可。
10.4怎么把外部文件复制到容器内部?
docker cp /opt/jenkins.sh fd:/usr/local/bin
上面就是把/opt下面的jenkins.sh复制到jenkins容器的/usr/local/bin目录下,复制的时候,要指定容器的id。同理也可以把容器内部的文件复制到外部。容器内部一般贸易vi命令,因此会把容器内部的文件复制出来修改后再复制到内部。
10.5若直接安装jenkins,则打包的文件在哪里?
在用户根目录下.jenkins/workspace/projectname/target/