# Docker

# 简介

docker官网 (opens new window)

docker镜像 (opens new window)

docker代理 (opens new window)

ce 社区版 免费 ee 企业版 收费

LTS 长期支持版 至少5年

meteor777 https://6ac535dk.mirror.aliyuncs.com yihe https://7c00aihk.mirror.aliyuncs.com

# centos7安装docker

#安装yum-utils等工具
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加阿里云镜像仓库的yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum(--disablerepo  忽略)
yum makecache

yum makecache --disablerepo=etcd
或
dnf makecache
#查看docker的可用版本
yum list docker-ce.x86_64 --showduplicates | sort -r

#指定版本安装
yum install -y docker-ce-版本号
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

或
#默认安装
yum install -y docker-ce

#查看状态
systemctl status docker

#启动docker
systemctl start docker
#设置docker开机启动
systemctl enable docker

#自启动
chkconfig docker on   或   systemctl enable docker.service
# 查看版本
docker -v



#配置cgroup(解决k8s加入集群问题)
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker

#安装docker-compose
yum -y install docker-compose

# 卸载docker

#卸载
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin


# ubuntu安装docker

image-20210126171538424

image-20210126171548759

image-20210126171603370

通过APT或脚本安装

# 脚本安装

#下载
curl -fsSL get.docker.com -o get-docker.sh

sh get-docker.sh --mirror Aliyun
#查看版本
docker version

# APT安装

# 更新软件源
sudo apt-get update
# 安装所需依赖
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 新增软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 再次更新软件源
sudo apt-get -y update
# 安装 Docker CE 版
sudo apt-get -y install docker-ce

# 镜像加速器


#将https://registry.docker-cn.com修改为自己的阿里云地址(https://7c00aihk.mirror.aliyuncs.com),在阿里云->容器镜像服务
vim /etc/docker/daemon.json

:set paste

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}


#重启docker
systemctl restart docker

#查看配置是否成功
docker info

image-20240607141421656

# 测试docker

#测试
docker pull tomcat

#查看镜像
docker images 

#如果想下载别的版本,latest可以到hub.docker.com看对应的版本
docker pull tomcat:9-jre8

#启动tomcat
docker run –p 8080:8080 tomcat

访问http://192.168.140.132:8080

# 4获取镜像

创建 Ubuntu Server X64 Docker Deploy,基于Ubuntu Server X64 Docker

#下载ubuntu
docker pull ubuntu:16.04

#进入docker上安装的ubuntu
docker run -it --rm \
ubuntu:16.04 \
bash

以交互的形式获取镜像,运行bash Ubuntu16.04的脚本,关闭时删除

# 5查看镜像

docker image ls
虚悬镜像
<none>

docker pull 或 build时,如果和上次版本相同则会出现虚悬镜像
#删除虚悬镜像
docker image prune

image-20210126171646420

# Docker 部署数据库

参考 系统搭建.md(## 安装mysql)

例子:mysql容器内修改配置

#先用默认配置启动容器

docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.42

#进入容器
docker exec -it mysql bash

#修改mysql初始接收文件大小

cd /etc/mysql/conf.d

max_allowed_packet=128
 
cat mysqldump.cnf

# Docker Compose安装

基于Ubuntu Server X64 Docker创建Ubuntu Server X64 Docker Compose

#查看最新版本    https://github.com/docker/compose/releases

#安装sudo
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

cd /usr/local/bin/

#查看权限,默认只有可读可写权限
ls -al

#修改权限
chmod +x /usr/local/bin/docker-compose

#查看版本
docker-compose version

#删除Docker Compose命令
sudo rm /usr/local/bin/docker-compose

# 测试docker-compose

cd /usr/local/docker/tomcat
#创建脚本
vim docker-compose.yml

version: '3'
services:
  tomcat:
    restart: always
    image: tomcat
    container_name: tomcat
    ports:
      - "8080:8080"

#启动
docker-compose up

# 容器数据持久化

在/usr/local/docker/tomcat/ROOT文件夹下创建index.html,写入hello Docker

mkdir ROOT

cd ROOT

vi index.html

执行命令实现持久化

docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat

以交互的方式进入容器

docker exec -it tomcat bash

image-20210126171859804

# 部署项目到容器

将项目拷贝到/ROOT

cd /usr/local/docker/tomcat

cp lx-web-admin-1.0.0-SNAPSHOT.zip ROOT/

解压.zip文件

用数据卷启动

docker run -p 8080:8080 --name myshop -v /usr/local/docker/tomcat/ROOT/:/usr/local/tomcat/webapps/ROOT -d tomcat

image-20210126172032755

# Docker Compose部署项目

cd /usr/local/docker/

mkdir myshop

#创建脚本
vim docker-compose.yml

version: '3'
services:
  web:
    restart: always
    image: tomcat
    container_name: web
    ports:
      - "8080:8080"
    volumes:
      - /usr/local/docker/myshop/ROOT:/usr/local/tomcat/webapps/ROOT

  mysql:
    restart: always
    image: mysql:5.7.42
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --explicit_defaults_for_timestamp=true
      - --lower_case_table_names=1
      - --max_allowed_packet=128M
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

将项目拷贝到ROOT目录

守护态启动

docker-compose up -d

image-20210126172118604

# 网络配置

在同一个docker-compose 可以访问,在不同的docker-compose内端口不对外暴露是不能访问的,需要创建一个公用的网络,并配置达到在容器内访问

image-20210126172133382

# Docker GitLab

基于Ubuntu Server X64 Docker创建

参考 系统搭建.md(## 安装GitLab)

# Docker Nexus

基于Ubuntu Server X64 Docker创建

参考 系统搭建.md(## 安装Nexus)

# Docker Registry 私服服务端

参考 系统搭建.md(## 安装 Docker Registry)

# Docker Deploy 私服客户端

参考 系统搭建.md(## 安装 Docker Deploy)

# 定制镜像到docker私服

#以tomcat为例
cd /usr/local/docker/tomcat

#下载tomcat镜像
docker pull tomcat

#创建Dockerfile,  FROM 基于镜像  RUN执行命令
vim Dockerfile

FROM tomcat

#构建镜像
docker build -t tomcat:1.0 .
#打标签
docker tag tomcat 172.17.110.248:5050/tomcat:1.0
#推送到docker私服
docker push 172.17.110.248:5050/tomcat:1.0

#启动镜像
docker run -d --name tomcat -p 8080:8080  tomcat:1.0
#查看docker私服
http://172.17.110.248:8880/home

image-20240607172935089

# 构建镜像到阿里云镜像

#创建Dockerfile

vim Dockerfile

# 基于java镜像创建新镜像
FROM openjdk:8

# 将jar包添加到容器中并更名为app.jar
ADD  ./dream-0.0.1-SNAPSHOT.jar /root/app.jar
# 运行jar包
ENTRYPOINT ["nohup","java","-jar","/root/app.jar","&"]


#构建镜像
docker build -t dream:1.0 .

#登录阿里云镜像仓库
docker login --username=meteor777 registry.cn-beijing.aliyuncs.com
#打标签
docker tag dream:1.0 registry.cn-beijing.aliyuncs.com/meteorplan/dream:1.0
#推送到镜像仓库
docker push registry.cn-beijing.aliyuncs.com/meteorplan/dream:1.0
#启动镜像
docker run -d --name dream -p 9093:8093  dream:1.0
#查看容器日志
docker logs -f -t --tail 1000 927bc6d83585

# Docker部署SpringMVC项目(lx-shop)

GitLab

http://172.17.110.248 用户名:root 密码:12345678

Nexus

http://172.17.110.248:8081/

Registry

http://172.17.110.248:5050/v2/ #Web访问 http://172.17.110.248:8880

# 1gitlab新建项目lx-shop

# 2jdk和maven配置

参考 系统搭建.md(## 安装jdk和maven)

# 3 在docker deploy 下载源码

cd /usr/local/docker

git clone http://172.17.110.248/root/lx-shop.git

# 4打包项目

cd /usr/local/docker/lx-shop

mvn clean install package -Dmaven.test.skip=true

#打包快照内文件到/usr/local/docker/lx-shop/image

mkdir image

cd /usr/local/docker/lx-shop/lx-web-admin/target/lx-web-admin-1.0.0-SNAPSHOT

tar -zcvf lx-shop.tar.gz .

mv lx-shop.tar.gz /usr/local/docker/lx-shop/image/

cd /usr/local/docker/lx-shop/image/

# 5创建镜像配置

vi Dockerfile

FROM tomcat

WORKDIR /usr/local/tomcat/webapps/ROOT

RUN rm -rf *

ADD lx-shop.tar.gz /usr/local/tomcat/webapps/ROOT

RUN rm -rf lx-shop.tar.gz

WORKDIR /usr/local/tomcat

image-20210126172630137

# 6构建镜像并推送

#构建并打标签
docker build -t 172.17.110.248:5050/lx-shop:1.0 .
#推送到docker私服
docker push 172.17.110.248:5050/lx-shop:1.0
#查看docker私服镜像
http://172.17.110.248:8880

image-20240608223241181

# 7测试

创建虚拟机Ubuntu Server X64 Docker lx-shop

配置私服客户端

#创建目录
cd /usr/local/docker/lx-shop

vi docker-compose.yml

version: '3.1'
services:
  lx-shop:
    restart: always
    image: 172.17.110.248:5050/lx-shop:1.0
    container_name: lx-shop
    ports:
      - "8080:8080"

#启动
docker-compose up -d

#访问
http://172.17.110.248:8080

docker exec -it c6e87fd7d615 bash

image-20210126172708057

# (待更新)Docker Harbor 企业级的Registry

# Docker Registry的缺点:

  1. 缺少认证机制,任何人都可以随意拉取及上传镜像,安全性缺失
  2. 缺乏镜像清理机制,镜像可以push却不能删除,日积月累,占用空间会越来越大
  3. 缺乏相应的扩展机制
#barbor版本  https://github.com/goharbor/harbor/releases

cd /usr/local/docker/harbor

#下载harbor
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
#解压
tar zxvf harbor-offline-installer-v2.11.0.tgz

cp /usr/local/docker/harbor/harbor/harbor.yml.tmpl /usr/local/docker/harbor/harbor/harbor.yml

#修改配置,设置(hostname,certificate,private_key)
vim harbor.yml


#harbor证书
#更新yum
yum makecache
#安装openssl
yum install openssl

#生成私钥
openssl genrsa -out harbor.key 2048
#生成证书
openssl req -new -key harbor.key -out harbor.csr

#生成自签名证书harbor.crt(有效期365天)
openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt

/usr/local/docker/harbor/harbor.crt
/usr/local/docker/harbor/harbor.key

#启动
sh harbor/install.sh

#访问
http://172.17.110.248:81
账号:admin
密码:Harbor12345

image-20240609105717430

image-20240609111615062

image-20240609111955239

# 使用


cd /usr/local/docker/lx-shop/image

#登录harbor
docker login -u admin -p Harbor12345 https://172.17.110.248:444
#构建并打标签
docker build -t 172.17.110.248:444/lx-shop/lx-shop:8.0 .
#推送
docker push 172.17.110.248:444/lx-shop/lx-shop:8.0

#退出登录
docker logout 172.17.110.248:444


#错误 cannot validate certificate for 172.17.110.248 because it doesn't contain any IP SANs

#通过重新生成证书并包含IP地址的SANs来解决此问题

cd /usr/local/docker/harbor
#创建一个SANs配置文件san.cnf
vim san.cnf

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = localhost
[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 172.17.110.248

#使用该配置文件生成证书
openssl req -new -newkey rsa:2048 -sha256 -nodes -out harbor.csr -keyout harbor.key -config san.cnf
#自签名证书
openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt -extensions v3_req -extfile san.cnf


#错误 Error response from daemon: Get "https://172.17.110.248:444/v2/": x509: certificate signed by unknown authority
# 系统无法识别签署证书导致的错误

#查看证书信息
openssl x509 -in harbor.crt -text -noout
#将证书导入到 Java 的信任存储中
keytool -import -trustcacerts -file harbor.crt -alias myrootca -keystore cacerts -storepass changeit
yes

#把harbor.crt复制到/etc/docker/certs.d
cp /usr/local/docker/harbor/harbor.crt .
#把自签名证书改名为172.17.110.248.crt
cp harbor.crt 172.17.110.248.crt
#重启docker
systemctl restart docker

image-20240609120733997

# Docker部署微服务

创建服务 Ubuntu Server X64 Docker Server

基于Ubuntu Server X64 Docker创建

微服务虚拟机

创建服务 Ubuntu Server X64 Docker Server Cloud, 基于Ubuntu Server X64 Docker Deploy创建

# 1部署itoken-dependencies到nexus私服

1cd itoken-dependencies

2mvn deploy

部署私服失败,更换Springcloud版本

Finchley.RC1,Finchley.M9在中央仓库都是残缺的,使用Finchley.SR1

3登录私服查询是否上传成功

image-20210126171302642

# 2部署itoken-config到nexus私服

1查看是否有ssh,没有则生成,并配置到gitlab

2cd /usr/local/docker

3 git clone ssh://git@192.168.140.137:2222/lx-itoken/itoken-config.git

4 cd itoken-config/

5 git pull

6 mvn clean package

由于获取不到nexus上的itoken-dependencies依赖,目前是将itoken-dependencies项目克隆到/usr/local/docker,

git clone ssh://git@192.168.140.137:2222/lx-itoken/itoken-dependencies.git

然后重新执行mvn clean package

7测试itoken-config是否可以正常访问

cd /usr/local/docker/itoken-config

cd target/

java -jar itoken-config-1.0.0-SNAPSHOT.jar

image-20210126171318636

8修改application.yml名称为bootstrap.yml

9 cd docker/

cp ../target/itoken-config-1.0.0-SNAPSHOT.jar .

vi Dockerfile

docker pull openjdk:8-jre

docker build -t 192.168.140.137:5000/itoken-config .

docker run -p 8888:8888 192.168.140.137:5000/itoken-config

测试是否可以获取配置

http://192.168.140.134:8888/itoken-eureka/prod/master


vim docker-compose.yml

version: '3.1'
services:
  itoken-config:
    restart: always
    image: 192.168.140.137/itoken-config
    container_name: itoken-config
    ports:
      - "8888:8888"

#启动itoken-config
docker-compose up –d

#查看日志 
docker logs -f itoken-config

# 3部署itoken-eureka到nexus私服

cd /usr/local/docker

git clone ssh://git@192.168.140.137:2222/lx-itoken/itoken-eureka.git

cd itoken-eureka/

mvn clean package

mkdir docker

cd docker/

cp ../target/itoken-eureka-1.0.0-SNAPSHOT.jar .

FROM openjdk:8-jre

RUN mkdir /app


COPY itoken-eureka-1.0.0-SNAPSHOT.jar /app/


CMD java -jar /app/itoken-eureka-1.0.0-SNAPSHOT.jar --spring.profiles.active=prod


EXPOSE 8761

docker build -t 192.168.140.137:5000/itoken-eureka .

vim docker-compose.yml

version: '3.1'
services:
  itoken-eureka1:
    restart: always
    image: 192.168.140.137:5000/itoken-eureka
    container_name: itoken-eureka1
    ports:
      - "8761:8761"

  itoken-eureka2:
    restart: always
    image: 192.168.140.137:5000/itoken-eureka
    container_name: itoken-eureka2
    ports:
      - "8861:8761"

  itoken-eureka3:
    restart: always
    image: 192.168.140.137:5000/itoken-eureka
    container_name: itoken-eureka3
    ports:
      - "8961:8761"

#测试eureka是否配置成功

http://192.168.140.134:8761

image-20210126171336783

# 4zipkin同理

http://192.168.140.134:8861/eureka/

http://192.168.140.134:8961/eureka/

# 5GitLab Runner

# 1创建runner文件

cd /usr/local/docker/

mkdir runner

# 2创建docker-compose.yml


vim docker-compose.yml

version: '3.1'
services:
  gitlab-runner:
    build: environment
    restart: always
    container_name: gitlab-runner
    privileged: true
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

# 3创建Dockerfile

mkdir environment

cd environment/

vi Dockerfile

# 4创建加速器daemon.json

vi daemon.json

{

"registry-mirrors": [

"https://registry.docker-cn.com"

],

"insecure-registries": [

"192.168.140.137:5000"

]

}

# 5上传jdk.gz,maven.gz,get-docker.sh

# 6启动docker compose

cd /usr/local/docker/runner

docker-compose up -d

# 6注册 Runner

docker exec -it gitlab-runner gitlab-runner register

image-20210126171356351

eureka项目 =》设置 =》 CI/CD =》Runner

image-20210126171405157

刷新gitlab可以看到已经注册成功

image-20210126171414755

config服务同理

# hub.docker镜像上传到阿里云镜像

#windows启动Docker Desktop

#打开cmd窗口

#下载镜像
docker pull nginx

#windows导出镜像到D盘
docker save -o D://flannel-cni-plugin.tar flannel/flannel-cni-plugin:v1.4.1-flannel1

docker save -o D://etcd-host.tar eipwork/etcd-host:3.4.16-2
docker save -o D://kuboard.tar eipwork/kuboard:v3
docker save -o D://jenkins.tar jenkins/jenkins:2.452.2-lts
docker save -o D://openvpn-as.tar linuxserver/openvpn-as:latest
docker save -o D://sentinel-dashboard.tar bladex/sentinel-dashboard:1.8.7
docker save -o D://jumpserver.tar jumpserver/jms_all:v3.8.1
docker save -o D://rocketmq.tar apache/rocketmq:5.2.0
docker save -o D://redis.tar redis:7.4.1-alpine
#linux导出镜像
docker save -o /root/flannel.tar flannel/flannel:v0.25.2
docker save -o /root/seata.tar seataio/seata-server

#rz上传至服务器,加载镜像
docker load -i /root/redis.tar

#查看
docker images

#登录阿里云镜像仓库
docker login --username=meteor777 registry.cn-beijing.aliyuncs.com
#打标签
docker tag apache/rocketmq:5.2.0 registry.cn-beijing.aliyuncs.com/meteorplan/apache-rocketmq:5.2.0
#推送到镜像仓库
docker push registry.cn-beijing.aliyuncs.com/meteorplan/apache-rocketmq:5.2.0
#下载镜像
docker pull registry.cn-beijing.aliyuncs.com/meteorplan/apache-rocketmq:5.2.0

# docker镜像与阿里云镜像对应表

hub.docker镜像 阿里云镜像
eipwork/etcd-host:3.4.16-2 registry.cn-beijing.aliyuncs.com/meteorplan/etcd-host:3.4.16-2
eipwork/kuboard:v3 registry.cn-beijing.aliyuncs.com/meteorplan/eipwork-kuboard:v3
jenkins/jenkins:2.452.2-lts registry.cn-beijing.aliyuncs.com/meteorplan/jenkins-jenkins:2.452.2-lts
linuxserver/openvpn-as:latest registry.cn-beijing.aliyuncs.com/meteorplan/openvpn-as:latest
bladex/sentinel-dashboard:1.8.7 registry.cn-beijing.aliyuncs.com/meteorplan/bladex-sentinel-dashboard:1.8.7
jumpserver/jms_all:v3.8.1 registry.cn-beijing.aliyuncs.com/meteorplan/jumpserver-jms_all:v3.8.1
apache/rocketmq:5.2.0 registry.cn-beijing.aliyuncs.com/meteorplan/apache-rocketmq:5.2.0