docker
作者:★
- 2022 年 1 月 05 日
本文字数:5778 字
阅读完需:约 19 分钟
linux
查看系统内核版本 uname -r
查看文件cat fileName fileName
创建文件 cat >fileName
创建文件 touch fileName
查看文件路劲 whereis nginx
查看端口 netstat -tunlp
杀死进程 kill -9 pid
拷贝文件 cp -r src dir
查看监听IPV4端口
netstat -lnt | awk 'NR>2{print $4}' | grep -E '0.0.0.0:' | sed 's/. *://' | sort -n | uniq
tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
复制代码
安装
1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
复制代码
2.设置镜像仓库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
3.安装 docker,默认最新版
sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
4.启动 docker
systemctl start docker
复制代码
5.运行
docker run hello-world
复制代码
6.查看镜像
docker image
复制代码
7.卸载
yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
复制代码
8.配置阿里云镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://u9xcmjob.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码
docker 的常用命令
帮助命令
docker version
docker info
docker --help
帮助文档 https://docs.docker.com/engine/reference/commandline/commit/
复制代码
镜像命令
docker分层下载资源,共用相同资源,在不同版本中,节约内存空间
docker images --help
docker images 查看所有本地镜像
docker search [name] 搜索镜像
docker search --help 帮助命令提示
docker pull [name]:[tag] 下载镜像
docker rmi -f [name|id] [name|id] 删除镜像
docker rmi -f $(docker iamges -aq) 全部删除镜像
复制代码
commit 镜像
docker commit -m=“信息” -a=“作者” 容器id 目标镜像名:[tag] // 提交一个容器,成为镜像,存在本地
复制代码
容器命令
docker pull centos 下载系统
#新建容器并启动
docker run [可选参数] 镜像名
#可选参数
--name 容器的名字,区分容器
-d 后台方式运行, 必须要有一个前台进程运行的容器
-it 进入容器交互
-p 设置端口 3344:80
-P 随机端口
-v 数据卷挂载
-e 环境配置,密码
-rm 容器退出时自动移除,用完就删除
--link 容器关联,ping解决网络连通问题
#列出所有运行中的容器
docker ps [可选参数]
-a 以前运行的容器
-n=number 显示最近创建的容器
-q 显示所有容器的编号
#进入容器
docker run -it centos /bin/bash(设置进入模式) 启动并进入容器
#退出容器
exit 退出停止容器
ctrl+p+q 退出不停止容器
#删除容器
docker rm 容器id 删除指定容器,不包括运行中的容器
docker rm -f $(docker ps -aq) 删除所有容器 加上-f是强制删除
#启动停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id 强制停止当前容器
复制代码
常用其他命令
docker logs -tf [容器id] 查看日志
docker top [容器id] 查看容器进程信息
docker inspect [容器id] 查看镜像源数据
#进入正在运行的容器
docker exec -it [容器id] /bin/bash 开启新的窗口(常用)
docker attach [容器id] 不开启新的窗口
#容器文件拷贝到主机上
docker cp [容器id]:容器内的路径 主机路径
拷贝是一个手动过程,后面会使用 -v卷的技术实现自动过程
#查看镜像生成历史
docker history 容器id
复制代码
更改地区时间
timedatectl set-timezone Asia/Shanghai
timedatectl status
date
复制代码
练习
ngxin
docker pull nginx 下载nginx
docker run -d --name name -p 3344:80 nginx 启动容器
修改文件要进入容器内部十分的麻烦,可以在外部提供一个映射路径,从而修改容器内部文件
docker run --restart always -it -p 3344:80 --name xxx -v /var/lib/docker/volumes/jenkins/_data/workspace/vue3-test_master/dist:/usr/share/nginx/html -v nginx:/etc/nginx/conf.d/ ea335eea17ab
复制代码
安装 mongo
// 运行mongo --auth 需要认证
docker run -it --restart always -v /home/mongodbdata:/data/db --name chat_mongo -p 27017:27017 mongo
复制代码
生成 node 容器
docker run -it --restart always --name koa-chat -p 9999:80 -v /var/lib/docker/volumes/jenkins/_data/workspace/koa-chat-pipeline/:/home/koa-chat-pipeline/ node
复制代码
解压缩命令
#压缩文件夹
zip test.zip test
#解压缩到指定位置 -d
unzip test.zip -d ./test1
复制代码
数据卷
#绑定主机与容器的映射关系
docker run -it -v 主机目录:容器目录 centos /bin/bash
#具名挂载和匿名挂载: /var/lib/docker/volumes/xxx/_data
docker volume ls // 查看所有的卷
-v 容器内路径 // 匿名挂载
-v name:容器内路径 // 具名挂载
-v /宿主机路径:/ 容器内路径
#删除数据卷
docker volume rm id
#挂载nginx
ro:只读
rw:可读写
docker run -d -p 8080:80 -v /etc/nginx:ro|rw nginx /bin/bash
注意:nginx 访问不了 /usr/sbin/nginx 或者 /usr/lib/nginx 重新启动nginx
注意:映射的数据卷文件夹被删除后,无法映射数据
#容器继承数据卷
docker run -it -p 27017:27017 --volumes-from bc4f9320c069 pl/nginx:1.0 /bin/bash
复制代码
docker 打包
#docker打包
docker build [可选参数] --help
-f dockerfile文件路径
-t tag:1.0 版本号
docker build -f /home/admin/dockerfile.dockerignore -t test/pl:1.1 .
注意:启动镜像生成容器后,会产生数据卷,与主机产生映射关系
#容器之间关联数据卷
--volumes-from // 数据卷绑定
docker run -it --name docker02 --volumes-from dockero1 镜像名
#打包镜像为tar文件
docker save -o dist.tar pl/dist:1.0
#导入镜像
docker load -i name.tar
复制代码
#大写的是指令
FROM CENTOS
VOLUME 容器路径
CMD echo "---end---"
CMD /bin/bash
复制代码
dockerfile
指令
#dockerfile是用来构建docker镜像的文件,命令参数脚本
#指令必须是大写
FROM 基础镜像
VOLUME 数据卷
RUN 运行镜像
COPY 将文件复制到镜像中
ADD 将文件添加到镜像中
WORKDIR 当前工作目录,进入容器时候的目录,通常是/目录
EXPOSE 对外端口
MAINTAINER 镜像谁写的
ENV 配置环境
CMD 容器启动时执行的命令,只有最后个有效,["ls", "-a"]
ENTRYPOINT 容器启动时执行的命令,可以追加
ONBUILD 构建时触发的命令
复制代码
发布镜像
#发布到dockerhub
1.注册dockerhub账号
2.登录账号
3.docker login -u -p --help
4.发布镜像上去,docker push NAME[:TAG]
#发布到阿里云容器,主要参考官方文档
1.登录阿里云
2.找到阿里云镜像服务
3.创建命名空间
4.创建容器镜像
复制代码
总结
Jenkins
#下载推荐版本
docker pull jenkinsci/blueocean
#运行/var/jenkins_home/
docker run -v /etc/localtime:/etc/localtime -it --restart always -p 8080:8080 -p 5000:50000 -v jenkins:/var/jenkins_home/ -v /var/run/docker.sock:/var/run/docker.sock -v "$HOME":/home 镜像id
#初始化默认密码
/var/jenkins_home/secrets/initialAdminPassword
#选择默认配置,安装下载默认插件
#创建用户
#配置账号密码,为gitee的登录密码
#替换升级站点的URL
http://mirror.xmission.com/jenkins/updates/update-center.json
#需要下載的插件
NVM:node的包管理工具
gitee:安装码云
Generic Webhook Trigger :通用鈎子插件
Publish Over SSH: 远程部署
#构建阶段使用yarn,shell脚本
node -v
npm install -g yarn -registry=https://registry.npm.taobao.org
yarn -v
yarn install --pure-lockfile
#--pure-lockfile 这个参数是在服务器install不生成yarn.lock,防止服务器和本地代码冲突
yarn run build
#jenkins构建报错
error Command failed with signal "SIGKILL".
服务器内存不足
复制代码
自动化部署
#jenkins构建映射到主机数据卷jenkins,用过nginx映射dist文件夹
复制代码
发邮件
#配置-> Extended E-mail Notification
SMTP服务器:smtp.qq.com
用户默认邮件后缀: @qq.com
#使用SMTP认证:
用户名:1354528629@qq.com
密码: pop3|SMTP 验证码
#使用SSL协议
SMTP端口:465
#Jenkins Location
系统管理员邮件地址:1354528629@qq.com
#项目->构建完成好->Editable Email Notification
Project Recipient List: 发送给谁,逗号隔开
复制代码
流水线 pipeline
#数据卷node服务路径/var/lib/docker/volumes/jenkins/_data/workspace/koa-chat-pipeline/
片段生成器
#拉取代码
checkout:拉取会放在workspace工作空间
#使用jenkinsfile,下载相应的插件
Docker plugin and Docker Pipeline plugin.
# 发生错误Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
映射docker.sock -v /var/run/docker.sock:/var/run/docker.sock
#错误Got permission denied while trying to connect to the Docker daemon socketat unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=node&tag=14.17.0": dial unix /var/run/docker.sock: connect: permission denied#
问题:权限不够
解决:sudo chmod 666 /var/run/docker.sock
#错误Error: EACCES: permission denied, scandir '/home/node/.npm/_logs'
问题:$HOME宿主机下面权限没打开
解决: chmod 777 /root/
复制代码
pipeline 发送邮件
post {
always{
//always部分 pipeline运行结果为任何状态都运行
emailext body:
'''<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>
<b><font color="#0B610B">Build Summary</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>Project Name: ${PROJECT_NAME}</li>
<li>Build Number: # ${BUILD_NUMBER}</li>
<li>Build Cause: ${CAUSE}</li>
<li>Build Status: ${BUILD_STATUS}</li>
<li>Build Log: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>Build Url: <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>Project Url: <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
</td>
</tr>
</table>
</body>''',
subject: '[Jenkins Build Notification] ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
to: '1354528629@qq.com;',
from: '1354528629@qq.com'
}
success {
//当此Pipeline成功时打印消息
echo 'success'
}
failure {
//当此Pipeline失败时打印消息
echo 'failure'
}
unstable {
//当此Pipeline 为不稳定时打印消息
echo 'unstable'
}
aborted {
//当此Pipeline 终止时打印消息
echo 'aborted'
}
changed {
//当pipeline的状态与上一次build状态不同时打印消息
echo 'changed'
}
}
复制代码
远程部署
#配置远程服务器连接信息 Manage Jenkins =》Configuration System ,两种方式(密码或者密钥)
#生成密钥
输入命令: ssh-keygen ,按照提示一直Enter键到底
/root/.ssh 目录下会生成私钥和公钥
id_rsa: 私钥
id_rsa.pub: 公钥
复制代码
多分支流水线
#创建blue,使用gitee账号密码创建凭证
复制代码
jenkinsfile
pipeline {
agent none
stages {
stage('rely') {
agent {
docker {
image "node:14.17.1"
args '-v /root/.m2:/root/.m2'
}
}
steps {
sh '''
node -v
yarn -v
yarn
yarn build
'''
stash includes: '**/dist/**', name: 'dist'
}
}
stage('docker') {
agent any
steps {
unstash 'dist'
sh '''
docker -v
pwd
docker build -t pl/dist:latest .
docker save -o dist.tar pl/dist:latest
'''
stash includes: '**/dist.tar', name: 'distTar'
}
}
stage('rep') {
agent any
steps {
unstash 'distTar'
sshPublisher(publishers: [sshPublisherDesc(configName: 'zhenfaroot', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''
cd /pl
sh default.sh
''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'dist.tar,default.sh')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
复制代码
default.sh
docker rm -f pl-dist
docker rmi -f pl/dist:latest
docker load -i dist.tar
docker run -d --name pl-dist -p 80:80 pl/dist:latest
复制代码
Dockerfile
FROM nginx:alpine
COPY ./dist/ /usr/share/nginx/html/
EXPOSE 80
复制代码
划线
评论
复制
发布于: 1 小时前
版权声明: 本文为 InfoQ 作者【★】的原创文章。
原文链接:【http://xie.infoq.cn/article/2cd7297b0d28bbdc331a5ec8b】。文章转载请联系作者。
★
关注
还未添加个人签名 2020.08.05 加入
还未添加个人简介
评论