安装Docker
卸载本机docker
yum remove docker
安装依赖软件
yum install yum-utils device-mapper-persistent-data lvm2 -y
添加docker yum源
## 阿里镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 也可以选Docker官方镜像源,二选一,但阿里云的更快
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker
yum list docker-ce --showduplicates | sort -r
yum install docker-ce docker-ce-cli containerd.io -y
配置阿里云镜像加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://gsm39obv.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
## 使用docker info查看生效情况
这个镜像加速地址,自己可以去阿里云申请,每个阿里云帐号申请的地址不同
启动docker
## 查看docker版本
docker -v
## 启动docker
systemctl start docker
# 配置docker开机启动
systemctl enable docker
docker相关知识
镜像
常用命令
指令 | 描述 |
---|---|
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或者多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
rm | 溢出一个或者多个镜像 |
prune | 溢出未使用的镜像,没有被标记或者被任何容器引用的镜像 |
tag | 创建一个引用源镜像标记目标镜像 |
export | 导出容器文件系统到tar归档文件 |
import | 导入容器文件系统tar归档文件创建镜像 |
save | 保存一个或者多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或者标准输出 |
docker search 镜像名称 搜索镜像
docker pull 镜像名称 拉取镜像
docker images 查看本地所有镜像
docker rmi -f 镜像名称:标签 删除镜像
docker pull openjdk:8-jdk-alpine
示例: 导入本地镜像并上传至docker仓库
# 导入镜像
docker import nginx-ingress-controller.tar
# 查看导入结果
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 592c00268a2b 6 seconds ago 327MB
# 将导入的镜像打标签,名称为 docker帐号/镜像名称:tag
docker tag 592c00268a2b wangshui898/nginx-ingress-controller:0.30.0
# 登录docker帐号
docker login -u wangshui898 -p xxxxxx
# 上传镜像
docker push wangshui898/nginx-ingress-controller:0.30.0
The push refers to repository [docker.io/wangshui898/nginx-ingress-controller]
a7c2578382b2: Pushed
0.30.0: digest: sha256:6c267dccd715f599d097a065aa55a960bdb9a20ef6fa9816777a8196ea8ae811 size: 529
# 上传完成,下载验证
docker pull wangshui898/nginx-ingress-controller:0.30.0
0.30.0: Pulling from wangshui898/nginx-ingress-controller
6d1b855bf490: Pull complete
Digest: sha256:6c267dccd715f599d097a065aa55a960bdb9a20ef6fa9816777a8196ea8ae811
Status: Downloaded newer image for wangshui898/nginx-ingress-controller:0.30.0
docker.io/wangshui898/nginx-ingress-controller:0.30.0
### 相关知识
cgroups: 资源限制- cpu,内存等
namespace: 资源隔离-进程,文件系统,用户
ufs: 联合文件系统-镜像增量式存储,提高磁盘利用
容器
容器:容器是由镜像创建而来。容器是Docker运行应用的载体,每个应用都分别运行在Docker的每个
容器中。
常用命令
docker run -i 镜像名称:标签 运行容器(默认是前台运行)
docker ps 查看运行的容器
docker ps -a 查询所有容器常用的参数
镜像分两种,一种是基础镜像.例如centos:latest,一种是环境镜像,类似nginx:latest,基础镜像没有守护进程,所以只使用-d参数直接创建无法起来,但是可以用交互模式(-it),创建一个伪终端作为守护进程
docker run -itd centos
或者直接创建容器后直接进入使用容器
docker run -it centos /bin/bash
docker start/stop/restart 容器名称/ID 启动/停止/重启容器
## 创建容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
## 示例:
## 创建容器,镜像名称:myjava,容器名称:java1.8,暴露端口:8088,传入变量JAVA_HOME=/usr/local/java1.8,将本机/data目录挂载到容器中的/opt/data设置开机启动
docker run -d --name java1.8 -e JAVA_HOME=/usr/local/java1.8 -p 8088:8080 -v /data:/opt/data --restart=always myjava:latest
## 进入容器
docker exec -it 容器ID/容器名称 /bin/bash 进入容器内部
## 示例:
docker exec -it nginx /bin/bash
## 删除容器
docker rm -f 容器名称/ID 删除容器
## 删除所有容器
docker rm $(docker ps -a -q)
## 检查容器
docker inspect nginx
## log查看
docker logs nginx
常用参数
-i, --intaractive 运行容器
-t, --tty 分配一个伪终端
-d, --detach 后台守方式运行(守护式)
-e, --env 设置环境变量
-p, --publish list 发布容器端口到主机
-P, --publish-all 发布容器所有expose端口到主机
–name string 指定容器名称
-ip string 指定容器IP,只能用于自定义网络
–network 连接容器到一个网络
–mount mount 将文件系统附加到容器
-v, --volume list 绑定挂载一个卷
–restart string 容器退出时重启策略,默认no,可选值[always|on-filure]
资源限制
docker update --help
docker run --help
资源设置-内存
-m -- /
--memory-swap 总内存
--memory 物理内存
--memory-swap=4M --memory=4M //可用物理内存4M
--memory-swap=8M --memory=4M //可用物理内存4M,可用swap=8M-4M=4M
--memory-swap=0或者unset //不设置swap,可用大小为2*memory
--memory-swap=-1 //可用最大swap
--oom-kill-disable //禁用OOM Killer
示例:
允许容器最多使用500M内存和100M的swap,并禁用OMM Killer
docker run -d --name nginx01 --memory="500M" --memory-swap="600M" --omm-kill-disable nginx:latest
资源设置-CPU
--cpus //能够限制容器可以使用cpu的数量
--cpuset-cpus="" //限制容器允许使用特定的的CPU核心,如(0,1或者0-3)
--cpu-shares=0 //CPU共享权值(相对权值),默认值1024,比如三个容器,分别是1024,2048,4096,使用cpu的比例为1/7,2/7,4/7
--cpuset-mems="" //允许在上执行的内存节点(MEMs)
--cpu-period=0 //设置调度周期,CFS周期的有效方法范围是1ms~1s,对应的--cpu-period的数值范围是1000~1000000
--cpu-quota=0 //设置在每个周期内容器能使用的CPU的时间,容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>=1000,单位毫秒
示例:
允许最多使用一个半CPU:
docker run -d --name nginx02 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx03 --cpus=".5" nginx
查看资源使用
docker stats nginx02
Docker持久卷
相关知识
Docker提供三种方式将数据从宿主机挂载到容器中:
- volumes: Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)–保存数据的最佳方式
- bind mounts: 将宿主机上的任意位置文件或者目录挂载到容器中
- tmpfs: 挂载存储在主机系统的内存中,而不会写入主机的文件系统. 如果不希望将数据存储在任何位置,可以选择tmpfs, 同事避免写入容器可写层提高性能
需要持久化的数据:
- 日志
- 配置文件
- 业务数据
- 临时缓存数据
常用命令
volumes:
## 创建持久卷
docker volume create htdocs
## 查看持久卷
docker volume ls
## 查看卷详细信息
docker inspect htdocs
## 挂载
docker run -d -v htdocs:/usr/share/nginx/html nginx
## 查看持久卷内容
ls /var/lib/docker/volumes/htdocs/_data
bind mounts:
docker run -d -v /data/htdocs:/usr/share/nginx/html nginx
- 宿主机文件或者目录必须存在才能挂载成功
- 宿主机文件或者目录覆盖容器中对应目录内容
镜像构建
镜像分类
- 基础镜像: 例如centos(yum), Ubuntu(apt), alpline(apk)
- 环境镜像: 例如php, jdk, python
- 项目镜像: 打包好的可部署镜像
镜像制作
- 选择一个符合上线条件的操作系统的基础镜像
- 用基础镜像创建一个容器,手动在容器里跑一遍你要部署的应用
- 确认你启动这个应用的前台运行命令
指令 | 描述 |
---|---|
FROM | 构建新镜像是基于哪个镜像 |
LABEL | 标签 |
RUN | 构建镜像时运行的shell命令 |
COPY | 拷贝文件或者目录到镜像中 |
ADD | 拷贝压缩文件到镜像中并解压 |
ENV | 设置环境变量 |
USER | 为RUN,CMD和ENTRYPOINT执行命令指定运行用户 |
EXPOSE | 生命容器运行的服务端口 |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录 |
ENTRYPOINT | 运行容器时执行,如果多个ENTRYPOINT指令,最后一个生效 |
CMD | 运行容器时执行,如果多个CMD指令,最后一个生效 |
镜像构建
Dockerfile
示例:
FROM cents:6.8
RUN touch /tmp/1.txt
RUN mkdir /data/
VOLUME /data
EXPOSE 80
CMD tail -f /tmp/1.txt
RUN 指令尽量合并到一块,使用&& \ ,来减少镜像层
清理部署时产生的缓存或者文件
nginx示例
FROM centos:6.8
MAINTAINER [email protected]
VOLUME /usr/local/nginx/html
RUN useradd www /sbin/nologin
RUN yum install gcc gcc-c++ make openssl-devel pcre-devel && \
yum clean all
ADD nginx-1.12.2.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.12.2 && \
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module \
--with-http_ssl_module --with-http_gzip_static_module && \
make -j2 && \
make install
RUN ln -fs /dev/stdout /usr/local/nginx/logs/access.log && \
ln -fs /dev/stderr /usr/local/nginx/logs/error.log
# COPY nginx.conf /usr/local/nginx/conf/nginx.conf
ENV PATH $PATH:/usr/lcoal/nginx/sbin
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
关于VOLUME
VOLUME: 声明容器中的目录作为匿名卷, 生成镜像后,创建容易可以使用-v绑定到宿主主机目录,如果不绑定,则会在/var/lib/docker/volumes下生成一个目录来绑定匿名卷
解决容器中tomcat启动慢的问题
有两种解决办法:
1)在Tomcat环境中解决
可以通过配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。
2)在JVM环境中解决
打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
替换成securerandom.source=file:/dev/urandom
securerandom.source=file:/dev/./urandom
构建镜像
docker build -t mynginx:v1.0 ./
启动镜像
docker run -id --name mynginx -p 80:80 -v /data/htdocs:/usr/local/nginx/html --image=mynginx:v1.0
上传镜像(本地通过k8s或者docker部署官方仓库,并启动)
docker tag mynginx:v1.0 10.0.0.130:5000/lnmp/nginx:v1.0
docker push 10.0.0.130:5000/lnmp/nginx:v1.0
容器编排
安装 docker-compose
方法一:
https://github.com/docker/compose/tags
点击download,下载对应版本
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compost
chmod +x /usr/local/bin/docker-compost
docker-compose --version
docker-compose version 1.23.2, build 1110ad01
方法二
pip3 install docker-compose
相关参数
docker-compose
-f 指定使用yaml文件位置
ps 显示所有容器信息
restart 重启容器
logs 查看日志信息
config -q 验证配置文件
stop/start 停止/启动容器
up -d 启动容器项目
pause 暂停容器
unpause 恢复容器
rm 删除容器
镜像仓库
官方镜像仓库
- docker安装
docker run -id --name registry -p 5000:5000 registry:latest
- k8s安装
kubectl run registry --image=registry:latest kubectl expose pod/registry --port=5000 --target-port=5000 --type=NodePort --name=registry-service
访问地址
http://IP:5000/v2/
harbor镜像仓库
前置条件: 已安装docker-compose
相关组件
组件 | 功能 |
---|---|
harbor-adminiserver | 配置管理中心 |
harbor-db | Mysql数据库 |
harbor-jobservice | 负责镜像复制 |
harbor-log | 记录操作日志 |
harbor-ui | Web管理页面和API |
nginx | 前端代理,负责前端页面和镜像上传/下载转发 |
redis | 会话 |
registry | 镜像存储 |
下载地址
https://github.com/goharbor/harbor/releases
tar -zxf harbor-offline-installer-v2.1.0.tgz
mv harbor /usr/local/
cp harbor.yml.tmpl harbor.yml
## 编辑配置
vim harbor.yml
hostname: 192.168.104.145
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 85
# https related config
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
data_volume: /data/harbor
## 安装
./install.sh
访问: ip:85
默认账户密码:admin/Harbor12345
配置项目,用户
docker登录私有仓库
docker login --username=wangshui898 http://192.168.104.145:85
启动关闭
进入目录下
docker-compose up -d 启动
docker-compose stop 停止
docker-compose restart 重新启动
上传镜像
配置daemon.json,把镜像仓库地址设置为可信地址
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://gsm39obv.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.104.145:85"]
}
## 登录镜像仓库
docker login --username=wangshui898 http://192.168.104.145:85
## 给镜像打上标签
docker tag nginx:v2 192.168.104.145:85/wangshui898/nginx:v2
## 推送镜像
docker push 192.168.104.145:85/wangshui898/nginx:v2
Docker部署常用服务
部署Gitlab
mkdir /opt/gitlab
cd /opt/gitlab
docker run -d --name gitlab -m 8192M -c 1024 \
-p 8443:443 \
-p 88:80 \
-p 22110:22 \
-v $PWD/config:/etc/gitlab \
-v $PWD/logs:/var/log/gitlab \
-v $PWD/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
--restart=always gitlab/gitlab-ce:latest
git命令(linux)
## 初始化
git init
## 添加远程分支
git remote add origin http://192.168.104.200:88/root/java-daemo.git
## 查看git配置是否生效
cat .git/config
## 添加本地缓冲区
git add .
## 提交到本地
git commit -m "all"
## 提交到远程
git push origin master
部署Jenkins
mkdir -p /data/jenkins/jenkins_home
cd /data/jenkins
docker run -d -m 4096M -c 1024 -p 8088:8080 -p 50000:50000 --name jenkins -u root \
-v /data/jenkins/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/apache-maven3:/usr/local/apache-maven3 \
-v /usr/local/java/jdk1.8.0_251:/usr/local/java/jdk1.8.0_251 \
-v /etc/localtime:/etc/localtime \
--restart=always jenkinsci/blueocean:1.24.4
登录:
http://IP:8088
## 更换jenkins插件源: 插件管理->高级设置
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
## 更换下载地址
cd /data/jenkins/jenkins_home/updates
sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json && sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json
## 重启jenkins
docker restart jenkins
上面的命令根据实际default.json里的地址来改,不通版本jenkins地址可能不一样
pipeline脚本示例
#!/usr/bin/env groovy
def registry = "192.168.31.70"
def project = "welcome"
def app_name = "demo"
def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"
def git_address = "[email protected]:/home/git/java-demo.git"
def docker_registry_auth = "b37a147e-5217-4359-8372-17fd9a8edfcc"
def git_auth = "b3e33c8b-c7e0-47b9-baee-d7629d71f154"
pipeline {
agent any
stages {
stage('拉取代码'){
steps {
checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
}
stage('代码编译'){
steps {
sh """
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH
mvn clean package -Dmaven.test.skip=true
"""
}
}
stage('构建镜像'){
steps {
withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
echo '
FROM ${registry}/library/tomcat:v1
LABEL maitainer lizhenliang
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
' > Dockerfile
docker build -t ${image_name} .
docker login -u ${username} -p '${password}' ${registry}
docker push ${image_name}
"""
}
}
}
stage('部署到Docker'){
steps {
sh """
REPOSITORY=${image_name}
docker rm -f tomcat-java-demo |true
docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name}
"""
}
}
}
}
部署MAVEN私库
mkdir -pv /data/nexus3/nexus-data
chmod 777 /data/nexus3/nexus-data
docker run -d -m 1024M -c 512 -p 8081:8081 -p 8082:8082 -p 8083:8083 -v /data/nexus3/nexus-data:/nexus-data --restart=always --name nexus3 sonatype/nexus3
8082端口是用于host镜像仓库的服务端口
8083端口用户group镜像仓库的服务端口
8081 端口是nexus的服务端口
登录地址
http://IP:8081
根据提示登录,设置密码,设置访问权限等
常用远程仓库地址:
官方地址: https://repo1.maven.org/maven2/
jboss的maven中央仓库地址:http://repository.jboss.com/maven2/
阿里云的maven中央仓库地址:http://maven.aliyun.com/nexus/content/groups/public/
apache的maven中央仓库地址:http://repo.maven.apache.org/maven2/
maven的setting.xml配置本地仓库–样例
<!--设置本地仓库位置-->
<localRepository>/data/maven3/data</localRepository>
<!--nexus服务器帐号口令-->
<servers>
<server>
<id>nexus</id>
<username>admin</username>
<password>admin0123456</password>
</server>
</servers>
<mirrors>
<!--nexus服务器-->
<!--组资源库的url地址 id和name自定义,mirrorOf的值设置为central,写死的-->
<mirror>
<id>nexus</id>
<name>nexus repository</name>
<url>http://192.168.104.191:8081/repository/maven3_group/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</mirrors>
以上都需要填写到对应位置
上传第三方jar包
mvn deploy:deploy-file -DgroupId=fun.leen.tools -DartifactId=tools -Dversion=v191028 -Dpackaging=jar -Dfile=/usr/local/src/tools-v191028.jar -Durl=http://192.168.104.191:8081/repository/maven3_localhost/ -DrepositoryId=nexus
-DgroupId=xxxxxx 就相当于pom中的groupId -DartifactId=xxxxxx 就相当于pom中的artifactId -Dversion=xxxxxx 就相当于pom中的版本号version -Dpackaging=xxxxxx 就相当于pom中打包方式 -Dfile=xxxxxx jar的本地磁盘位置 -Durl=xxxxxx hosted资源库的地址 -DrepositoryId=xxxxxx 对应的是setting.xml 里边的serverid
Docker监控
-
cAdvisor(Container Advisor): 用于收集正在运行的容器资源使用和性能信息
https://github.com/google/cadvisor
-
Prometheus(普罗米修斯): 容器监控系统
https://prometheus.io/
https://github.com/prometheus/prometheus
-
Grafana: 开源的度量分析和可视化系统
https://grafana.com/
https://grafana.com/grafana/dashboards/193 //监控docker模版
服务部署
cAdvisor
docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
四个-v挂载操作不能省,如果不挂载,将无法连接到docker deamon
Prometheus
mkdir /data/Prometheus/
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v /data/Prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
配置文件prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['192.168.104.200:9090']
- job_name: 'cAdvisor'
static_configs:
- targets: ['192.168.104.200:8080']
Docker部署Grafana
docker run -d \
--name=grafana \
-p 3000:3000 \
grafana/grafana