天天看点

Docker基础相关笔记安装Dockerdocker相关知识镜像构建容器编排镜像仓库Docker部署常用服务Docker监控

安装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, 同事避免写入容器可写层提高性能

需要持久化的数据:

  1. 日志
  2. 配置文件
  3. 业务数据
  4. 临时缓存数据

常用命令

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
           
  1. 宿主机文件或者目录必须存在才能挂载成功
  2. 宿主机文件或者目录覆盖容器中对应目录内容

镜像构建

镜像分类

  1. 基础镜像: 例如centos(yum), Ubuntu(apt), alpline(apk)
  2. 环境镜像: 例如php, jdk, python
  3. 项目镜像: 打包好的可部署镜像

镜像制作

  1. 选择一个符合上线条件的操作系统的基础镜像
  2. 用基础镜像创建一个容器,手动在容器里跑一遍你要部署的应用
  3. 确认你启动这个应用的前台运行命令
指令 描述
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	删除容器
           

镜像仓库

官方镜像仓库

  1. docker安装
    docker run -id --name registry -p 5000:5000  registry:latest
               
  2. 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
           

继续阅读