安装docker
不同系统安装方式有所不同
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常用命令
帮助命令
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镜像的文件
构建步骤:
- 编写一个dockerfile文件(文件命名
Dockerfile
构建就不用-f
指定文件) - docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像
DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
#
表示注释- 每一个指令都回创建提交一个新的镜像层,并提交
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>
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