一、启动相关
1.设置容器开机启动
在我们使用镜像run一个容器的时候,希望这个容器随着docker的启动而启动(我的情况是虚拟机经常开关机,所以docker肯定会经常关闭再开启,所以我run的容器需要跟随docker的启动起来,不想手动一个个启动)
1)设置docker开机自启
systemctl enable docker
2)初次启动容器设置自启
添加如下参数
--restart=always
举例
docker run --restart=always mysql:8.0.30
3)启动容器
如果某个容器停了,可以再次启动
docker restart 容器id
如果run的时候没有加这个参数,后期想让他开机启动,请跳转下方修改相关。
二、查询相关
1.查询所有容器(包括停止的)
docker ps -a
三、修改相关
1.指定容器开机自启动
docker update --restart=always 容器id
四、宿主机与容器交互相关
1.将指定容器内的文件复制到宿主机当前目录下
docker container cp nginx:/etc/nginx .
注意命令最后是空格跟上一个点
五、安装中间件相关
1.mysql(5和8)
①创建mysql实例并运行
docker run -d -p 3306:3306 --privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql mysql:5.7
参数说明
–name:表示为当前容器起一个名字
-p3306:3306:将容器的3306端口映射到主机的3306端口
-v/mydata/mysql/conf:/etc/mysgl:将配置文件夹挂载到主机
-v/mydata/mysql/log:/var/log/mysgl:将日志文件夹挂载到主机
-v/mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
-d 表示mysql以后台方式运行
②配置mysql的配置文件
cd /mydata/mysql/conf/
vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
重启mysql
docker restart mysql
不在mysql5存在的基础上
,单独部署mysql8,非共存方法。
①先跑一个mysql8,用于拷贝相关配置文件到宿主机
mkdir -p /mydata/mysql8
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20
docker cp mysql:/etc/mysql /mydata/mysql8/
cd /mydata/mysql8/mysql/conf.d
②增加配置文件
vim my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
删除第一个mysql8实例
docker stop mysql
docker rm mysql
重新创建mysql8实例
docker run \
-p 3306:3306 \
--name mysql \
--privileged=true \
--restart unless-stopped \
-v /mydata/mysql8/mysql:/etc/mysql \
-v /mydata/mysql8/logs:/logs \
-v /mydata/mysql8/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.20
之后你可以进入mysql容器,配置一些自己需要的东西
docker exec -it mysql /bin/bash
mysql -u root -p
2.安装redis
①下载redis镜像
docker pull redis:5.0.5
②在宿主中创建目录
mkdir -p /mydata/redis
③宿主机下初始化redis.conf文件
touch /mydata/redis/redis.conf
④运行一个redis实例
docker run --restart=always -p 6379:6379 --name redis --privileged=true \
-v /mydata/redis/redis.conf:/etc/redis/redis.conf \
-v /mydata/redis/data:/data \
-d redis:5.0.5 redis-server /etc/redis/redis.conf
如果需要增加密码,加上这个参数即可,这里密码是123456
--requirepass 123456
–restart=always:表示每次docker重启后会自启动,其余参数参考上述mysql相关配置
⑤进入redis检查
docker exec -it redis /bin/bash
redis-cli
简单测试
⑥设置持久化策略(虚拟机可选)
这样数据就不是只在内存中了,会持久化到磁盘,防止每次重新启动虚拟机,缓存都没有了。
去宿主机修改对应配置
退出到宿主机
exit
exit
编辑redis.conf文件
vim /mydata/redis/redis.conf
appendonly yes
重启redis
docker restart redis
测试redis数据是不是会持久化到磁盘
前提是已经修改完配置文件并且已经重启redis实例,先进入redis进行随便一个数据的插入,然后退出到宿主机,重启redis,再次进入redis中发现数据还在则证明配置生效。
3.安装elasticsearch
1.下载es镜像
docker pull elasticsearch:7.4.2
2.在宿主机上创建目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
mkdir -p /mydata/elasticsearch/plugins
重新设置文件夹权限,任何用户任何组都有读写权限
chmod -R 777 /mydata/elasticsearch
3.创建elasticsearch.yml文件,并配置
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
4.启动一个实例
docker run --restart=always --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
-p 暴露两个端口
-e 指定一个参数
discovery.type=single-node:表示单节点运行
-Xms64m -Xmx128m:设置es内存初始内存占用64mb,最大占用128mb
-v 挂载,docker容器中的文件和宿主机对应关联上,在容器外部也就是在宿主机进行文件的修改,容器里边的es也会对应修改,不用每次都进入容器内进行操作。
5.验证是否安装成功
浏览器访问如下地址
http://你宿主机的ip地址:9200/
4.安装kibana
1.下载kibana镜像
docker pull kibana:7.4.2
2.运行一个实例
docker run --restart=always --name kibana \
-p 5601:5601 \
--link es容器名称(安装es时起的别名elasticsearch ) \
-e "ELASTICSEARCH_URL=http://宿主机ip地址:9200" \
-d kibana:7.4.2
–link :同一个宿主主机上的多个docker容器之间如果需要进行通信,第一种最容易想到的方式就是使用容器自身的ip地址、宿主主机的ip+容器暴露出的端口号来通信,我们知道默认情况下docker重新run后,对应的IP地址就会改变,这样如果两个容器之间通信就会变得非常麻烦,每次都要修改通信的IP地址。这个时候 --link参数就派上大用场了,它会给要链接的容器设定一个通信的别名,即使重启后IP地址发生了改变,依然可以正常通信。
link 格式:
– link:目标容器名称:别名(别名可以不写)
3.验证是否运行成功
http://宿主机地址:5601/
如果是这个页面,先等一会再访问一下,看看是否启动成功
如果长时间还是这个页面,需要查询相关日志
docker logs 容器ID前三位
情况举例
启动成功页面
5.安装Nginx
1.前期准备
由于nginx要创建的配置多一些,这里先跑一个实例,把配置信息从容器中复制到宿主机。
如果没有Nginx1.10版本,docker会自动下载,这里就不docker pull了
①运行一个临时的Nginx容器
docker run -p 80:80 --name nginx -d nginx:1.10
②宿主机新建目录
mkdir /mydata/nginx
cd /mydata/nginx
③将容器内的配置文件拷贝到当前宿主机目录
cp 后跟的是容器的名称,最后是空格跟上点
格式:docker container cp 空格 容器名 冒号 容器内路径 空格 点
docker container cp nginx:/etc/nginx .
④修改宿主机文件夹名称
mv nginx conf
⑤再次创建nginx目录,并把conf整个移动到该目录下
mkdir /mydata/nginx
mv conf /mydata/nginx
⑥停止容器并删除
docker stop nginx
docker rm nginx
2.运行nginx实例
docker run --restart=always -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
6.安装Jenkins(单个maven项目完成,探索复杂项目…)
先更新宿主机的时间,后续会挂载对应时间配置。
查询当前系统时间
date
①查看时区,如果已是上海时区可不用设置
timedatectl status | grep 'Time zone'
②设置硬件时钟调整为与本地时钟一致
timedatectl set-local-rtc 1
③设置时区为上海
timedatectl set-timezone Asia/Shanghai
docker安装最新版本的Jenkins
这里注意一点,我们之前了解的都是如果不指定版本,那么默认下载的就是最新版本,从其他博客哪里了解到安装jenkins推荐的版本叫jenkins/jenkins
我们先看下jenkins有哪些版本
这块,都说了不建议使用这样的方式安装jenkins改用jenkins/jenkins:lts这种方法。
所以以下这种方式不推荐
docker pull jenkins
拉取jenkins最新版本镜像。
还是去官网溜达一圈
官网安装地址
这俩docker随便一个地址都行,都是跳转docker镜像仓库地址,你以为有区别实则我都看了。
这块写着最新的lts版本,但是我还是想进去看看都有哪些版本
在你拉取最新镜像时很大概率会超时,拉几次失败几次
参考这篇博客,增加镜像加速,代码我也贴出来
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
我这里拉取和运行分开执行,正常直接docker run,镜像不存在会自动下载
docker pull jenkins/jenkins:2.462.2-lts
如果你要重新启动一个容器,请注意一下,这个宿主机的挂载目录,如果想使用之前的宿主机目录,需要情况宿主机目录的数据,如果是使用其他目录则不需要,我这里使用的宿主机目录地址为/mydata/jenkins_home,如果重新run一个容器,需要把它子集所有的文件以及目录清空后在执行docker run
docker run \
--name jk \
--restart=on-failure \
--privileged=true \
--env JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m" \
-d \
-u root \
-p 8080:8080 \
-p 8888:8888 \
-p 50000:50000 \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /mydata/java/jdk17:/var/jenkins_home/java \
-v /mydata/maven/maven-3.9.8:/var/jenkins_home/maven \
-v /etc/localtime:/etc/localtime \
jenkins/jenkins:2.462.2-lts
前缀/mydata都是宿主机地址奥,-u root这个参数不加,jenkins一直报没有权限,目前没找到其他方法。
报错内容如下
加上之后,启动成功。
阅读官方文档可以得知,我们可以设置jvm相关参数等。
文档地址
找到初始密码
docker logs -f jk
启动失败,报错
解决方法:我们宿主机挂在的这个目录,找到这个配置文件
hudson.model.UpdateCenter.xml
切换国内镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
完整内容如下:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
修改完成后,重启容器
docker restart jk
再次查询日志,
找到密码之后复制,按ctrl+C退出。
访问地址:http://192.168.56.10:8080
初次进入输入你的初始密码
这里选择插件来安装
如果是选择推荐插件下载,有下载失败的情况。如图
需要更新插件源。
进入自己选择插件安装页面
先不创建新用户,还是使用admin账号
访问jk地址,我这里就使用默认的地址了。
登录名:admin已经提示给你了,密码就是你之前获取日志的密码。后续自己可以创建一个账号和对应密码,这里不在赘述。
6.1jk更换插件下载源
选择对应源:选择网址
复制update-center.json文件的链接,放到刚刚的jk配置位置。
6.2 jk更换为中文
安装中文插件
搜索(模糊搜索也可):Localization: Chinese (Simplified)
Localization: Chinese (Simplified)
勾选上,然后install。
等待下载success。
重启jk,可以docker 重启,或者在url中增加restart进行重启。
http://192.168.56.10:8080/restart
等他重启完即可。
账号为
admin
密码还是你的初始密码
至此,中文设置完毕!
6.3设置java和maven
6.3.1配置java环境
我们启动时挂载了jdk17和maven相关目录
如果完全按照我的步骤来的话,可以直接复制我的地址
/var/jenkins_home/java
6.3.2配置maven
如果完全按照我的步骤来的话,可以直接复制我的地址
/var/jenkins_home/maven/conf/settings.xml
如果完全按照我的步骤来的话,可以直接复制我的地址
/var/jenkins_home/maven
6.3.3安装必要插件
①git插件
②maven插件
③gitee(我的代码都在gitee上,所以这里安装一个gitee)
配置gitee私人令牌
https://gitee.com
去gitee上生成令牌
记录好生成的令牌。回到jk
进行测试
最后再最外层进行应用和保存
重启jk
6.3.4测试jk及对应配置是否生效
写了一个简单的测试demo,地址:https://gitee.com/july01/jk,需要自取
https版git地址:
https://gitee.com/july01/jk.git
成功构建!!!,下一步研究脚本,因为maven构建时没有跳过test而且jar包也没运行。
6.4设置构建脚本
6.4.1maven打包跳过test
clean install -U -Dmaven.test.skip=true
做一些调整,具体有很多配置,需要时间去研究
6.4.2配置简单的脚本命令(伪脚本)
在配置脚本之前,进入容器创建一个存放jar包的目录,不用它workspace的默认生成的目录。
docker exec -it jk /bin/bash
这个目录/var/jenkins_home是我们挂载的目录,宿主机也能看到,我就放到这里了,方便后续有问题进行反编译排查。
mkdir /var/jenkins_home/jarhome
进行脚本配置,我这里由于没配置打包的后jar包名,所以默认为jk-0.0.1-SNAPSHOT.jar
在控制台有输出你的工作区目录信息。
查询日志信息
打包完也有输出jar包路径
设置构建之后,执行脚本
#删除之前的jar包
rm -rf /var/jenkins_home/jarhome/jk-0.0.1-SNAPSHOT.jar
#把jar包移动到指定目录,存在则覆盖
cp -rf /var/jenkins_home/workspace/test/target/jk-0.0.1-SNAPSHOT.jar /var/jenkins_home/jarhome/
#进入指定目录
cd /var/jenkins_home/jarhome/
#阻止jenkins杀死项目进程
export BUILD_ID=dontKillMe
#模拟执行启动脚本
nohup java -jar jk-0.0.1-SNAPSHOT.jar &
再次进行构建,
查询日志
访问java项目
如果你之前看了我虚拟机的教程,配置的ip和我一致,直接访问下方即可
ps:之前命令docker run时没有映射8888端口,后续我增加了对8888的端口映射,如果你之前按照我的方式进行创建时,你可以直接stop jk然后rm jk,因为你已经把jk的目录挂载到了宿主机,所以尽情删除吧,重启run一个容器,用我最新的命令即可,密码还是之前生成的密码登录即可。
http://192.168.56.10:8888/api/test
否则为
http://宿主机ip:8888/api/test
结果
有细心的同学发现,这个构建记录的时间好像不太对。
还需改一个地方,点机账户,选择设置。
这里账户我换成july,你们的应该是admin。
设置亚洲:上海。之后重启容器即可