安装docker

docker安装文档 (opens new window)

不同系统安装方式有所不同

centos

# 1. 卸载旧版本
    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
                  
# 2. 设置repository	(网上找国内的阿里云的仓库会快些)
yum install -y yum-utils

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 3. 更新yum软件包索引	(建议)
yum makecache fast

# 4. 安装docker
yum install docker-ce docker-ce-cli containerd.io

# 5. 启动docker
systemctl start docker

# 6. 使用docker version查看版本信息查看是否安装成功
docker version

# 7. 测试hello world
docker run hello-world

docker镜像源加速

/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):

{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}

之后重新启动服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

卸载docker

# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# 2. 卸载资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

docker常用命令

676975-20200327093030108-1435560589

帮助命令

docker文档 (opens new window)

docker version			# 显示docker的版本信息
docker info				# 显示docker的系统信息,包括镜像和容器的数量
docker command --help	# 帮助命令

镜像命令

docker images 查看镜像

# 可选项
-a, --all		# 列出所有镜像
-q, --quiet		# 只显示镜像的id

docker search 搜索镜像

docker search mysql
# 可选项,通过收藏来过滤
--filter=stars=3000 

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag]

docker rmi 删除镜像

docker rmi -f 镜像id					#删除指定镜像
docker rmi -f $(docker images -aq)		#删除全部

容器命令

启动命令

docker run [可选参数] image

#参数说明
--name="name"		容器名字
-d					后台方式运行
-it					使用交互方式运行,进入容器查看内容
-p					指定容器端口
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口
	-p 容器端口
-P					随机指定端口

#启动并进入容器
docker run -it centos /bin/bash

列出所有运行的容器

docker ps

#参数说明
-a		#列出正在运行的容器+历史运行的容器
-n=?	#显示最近运行的容器
-q		#只显示容器的编号

退出容器

exit		#直接退出容器并停止
Ctrl+P+Q	#容器不停止退出

删除容器

docker rm 容器id				#删除指定容器,不能删除正在运行的容器,如果要强制删除,rm -f
docker rm -f $(docker ps -aq)	#删除所有容器
docker ps -a|xargs docker rm 	#删除所有容器

启动和停止容器操作

docker start 容器id		#启动容器
docker restart 容器id		#重启容器
docker stop 容器id		#停止容器
docker kill 容器id		#强制停止容器

常用其他命令

后台启动容器

docker run -d centos

查看日志

#显示日志
-tf					#显示日志
--tail number		#显示日志的条数
docker logs -tf --tail 10 dcaa698ed59f

查看容器中的进程信息

docker top 容器id

查看镜像的元数据

docker inspect 容器id

进入当前正在运行的容器

#方式一
docker exec -it 容器id /bin/bash

#方式二
docker attach 容器id

#docker exec	#进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach	#进入容器正在执行的终端,不会启动新进程

从容器内拷贝文件到主机上

docker cp dcaa698ed59f:/home/test.java /home

es+kibana

docker run -d --name es01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx256m" elasticsearch:7.6.2

可视化

  • portainer

docker图形化界面管理工具(看看就行,一般不用)

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer 
  • Rancher(CI/CD)

commit镜像

# 命令和git原理类似
docker commit -m="提交描述" -a="作者" 容器id 目标镜像名:[TAG]

容器数据卷

方式一:直接使用命令挂载 -v

docker run -it -v 主机目录:容器目录

#mysql
docker run -d -p 33066:3306 -v /home/test/conf:/etc/mysql/conf.d -v /home/test/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysqltest mysql:5.7

具名和匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有的volume的情况
docker volume ls

-v 容器内路径		# 匿名挂载
-v 卷名:容器内路径		# 具名挂载
-v /宿主机路径:容器内路径	#指定路径挂载

拓展:

#通过 -v 容器内路径:ro rw改变读写权限
ro readonly 	#只读(只能通过宿主机改变,容器内部无法改变)
rw readwrite 	#可读可写

docker run -d -P --name nginx01 -v nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginx:/etc/nginx:rw nginx

方式二: DockerFile

Dockerfile就是用来构建docker镜像的构建文件.

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
docker build -f DockerFile -t Ybond/centos:1.0 .

数据卷容器

docker run -it --name docker02 --volumes-from 12bdf830f74f 0bb4ec723263

--volumes-from 	#拷贝的概念

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的

DockerFile

dockerfile是用来构建docker镜像的文件

构建步骤:

  1. 编写一个dockerfile文件(文件命名Dockerfile构建就不用-f指定文件)
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都回创建提交一个新的镜像层,并提交

image-20211127135103437

DockerFile:构建文件,定义了一切步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务器

DockerFile指令

FROM					#基础镜像
MAINTAINER				#镜像是谁写的,姓名+邮箱
RUN						#镜像构建的时候需要运行的命令
ADD						#添加内容
WORKDIR					#镜像的工作目录
VOLUME					#挂载的目录
EXPOSE					#指定暴露端口
RUN						#运行
CMD						#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT				#指定这个容器启动的时候要运行的命令,可追加命令
ONBUILD					#当构建一个被继承DockerFile这个时候就会运行ONBUILD指令,触发指令
COPY					#类似ADD,将文件拷贝到镜像中
ENV						#构建的时候设置环境变量

CMD和ENTRYPOINT的区别

CMD ["ls","-a"]
docker run xx				#会执行ls -a
docker run xx -l			#会执行-l(报错)
docker run xx ls -l			#会执行ls -l

ENTRYPOINT ["ls","-a"]
docker run xx				#会执行ls -a
docker run xx -l			#会执行ls -a -l

#CMD运行时追加命令会替换CMD的命令,ENTRYPOINT运行时追加命令会追加到ENTRYPOINT命令

tomcat实战

FROM centos
MAINTAINER ybd0612<ybd0612@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-xxx.tar.gz /usr/local/
ADD tomcat-xx.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk-xx
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat-xx
ENV CATALINA_BASE /usr/local/tomcat-xx
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/tomcat-xx/startup.sh && tail -F /usr/local/tomcat/bin/logs/catalina.out

docker 镜像发布

登陆

docker login -u ybd0612@qq.com -p <PASSWORD> ybond-docker.pkg.coding.net

打标签

docker tag <LOCAL_IMAGE_TAG> ybond-docker.pkg.coding.net/myself/dtest/<PACKAGE>:<VERSION>

推送

docker push ybond-docker.pkg.coding.net/myself/dtest/<PACKAGE>:<VERSION>

image-20211129103246490

Docker网络

Docker0

Docker 使用的是Linux的桥接,宿主机中是一个Docker容器的网桥,docker0

Docker中的所有网络接口都是虚拟的,虚拟的转发效率高.

只要容器删除,对应的网桥就没了.

evth-pair技术

docker容器带来的网卡都是一对一对的,evth-pair 就是一对的虚拟设备接口,都是成对出现的,一段连着协议,一段彼此连接,evth-pair 就像一个桥梁,连接各种虚拟网络设备

容器互联

--link

实际就是在hosts配置中增加一个配置

自定义网络

docker network ls		#查看所有网络

网络模式

bridge:桥接模式

none:不配置网络

host:和宿主机共享网络

container:容器网络连通(用的少,局限很大)

#直接启动命令默认 --net bridge,使用的docker0
docker run -d -P --name tomcat01 --net bridge tomcat

#docker0特点,默认域名不能访问	--link可以打通连接

#自定义网络
# --driver bridge
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1
docker network create --driver bridge --subnet 196.169.0.0/16 --gateway 196.169.0.1 mynet

网络连通

 docker network connect mynet m01
 # 连通之后就是将m01放到了mynet网络下

Docker Compose

定义和运行多个容器

安装

1.下载

 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
 #国内镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.授权

sudo chmod +x /usr/local/bin/docker-compose

体验

创建项目目录

mkdir composetest
cd composetest

创建项目app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

创建依赖文件requirements.txt

flask
redis

创建Dockerfile文件Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

创建compose文件docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

构建并运行docker-compose up

访问测试curl localhost:5000

yaml规则

version: "3.9"		#版本
services:		#服务

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        max_replicas_per_node: 1
        constraints:
          - "node.role==manager"

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - "5000:80"
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==manager"

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  frontend:
  backend:

volumes:
  db-data:

Docker Swarm

搭建

1.生成主节点

2.加入(管理者,工作者)

--advertise-addr

#初始化节点 
docker swarm init --advertise-addr 172.19.70.0

#获取令牌
docker swarm join-token manager
docker swarm join-token worker

#加入
docker swarm join --token SWMTKN-1-00gx1t39x28k4wsb0rf0rp48d6inyj04hraf4hnha63hm24wmb-55t9jwj90orcd1nz1g13zq8jx 172.19.70.0:2377

Raft协议

管理节点数>=3, 可用管理节点>1

保证大多数节点存活,才可以使用

动态扩缩容

docker service update --replicas 3 my-nginx

#scale
docker service scale my-nginx=3

swarm

集群的管理和编号 .docker可以初始化一个swarm集群 ,其他节点可以加入(管理,工作者)

node

就是一个docker节点 ,多个节点就组成了一个车网络集群(管理,工作者)

service

任务 ,可以在管理节点或工作节点来运行 ,核心 ,用户访问

task

容器内的命令 ,细节任务

调用service以什么方式运行

--mode string
Service mode (replicated or global)(default "replicated")

网络模式: "PublishMode":"ingress"

Swarm:

Overlay:

ingress:特殊的Overlay网络,负载均衡的功能

Docker Stack

#单机
docker-compose up -d wordpress.yaml
#集群
docker stack deploy wordpress.yaml

Docker Secret

安全 ,配置密码 ,证书

docker secret

Docker Config

配置

docker config

其他

常用软件

iproute2 net-tools inetutils-ping