docker_0">1. docker学习之路
核心:隔离;
容器化技术不是模拟的一个完整的操作系统;
- 更快交付和部署
- 更便捷的升级和扩容
- 更简单的系统运维
- 更高效的计算资源利用
docker_9">1.2. docker组成
组件 | 概念 |
---|---|
镜像 | docker镜像为一个模板,可通过模板来创建容器服务; |
容器 | 独立运行一个或一组应用,通过镜像创建 |
仓库 | 存放镜像 |
官方安装文档
#查看系统内核版本
uname -r
# 查看系统信息
cat /etc/oslist
# 卸载docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-lastest docker-lastest-logrotate docker-logrotate docker-engine
sudo yum install yum-utils -y
# 配置docker镜像加速器
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
# 更新yum软件索引包
yum makecache fast
# 安装docker-ce,docker-ce-cli,containerd.io
yum install docker-ce docker-ce-cli containerd.io
# 启动docker
systemctl start docker
# 判断安装状态
docker version
# 测试docker engine
docker run hello-world
# 查看已下载镜像
docker images
# 卸载docker engine
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
Docker属于CS系统,Docker的守护进程运行,在主机上,通过socket从客户端访问,docker server执行收到的docker client命令;
docker 的镜像无需加载操作系统内核,避免引导,利用宿主机的操作系统,省略了加载的复杂过程;虚拟机是加载GuestOS;
Docker容器 | LXC | VM | |
---|---|---|---|
虚拟化类型 | OS虚拟化 | OS虚拟化 | 硬件虚拟化 |
性能 | =物理机性能 | =物理机性能 | 5-20%损耗 |
隔离性 | NS隔离 | NS隔离 | 强 |
QoS | Cgroup弱 | Cgroup弱 | 强 |
安全性 | 中 | 差 | 强 |
GuestOS | 只支持Linux | 仅支持Linux | 全部 |
docker_76">2. docker镜像命令
镜像命令 | |
---|---|
docker images | -a |
–digests | |
–format “{{.ID}} {{.Repository}} {{.Tag}} {{.Digest}} {{.CreatedSince}} {{.CreatedAt}} {{.Size}}” | |
–no-trunc | |
-q | |
–filter “key=value” | |
docker search | |
–filter stars=3 is-official=true | |
–format “{{.Name}} {{.Description}} {{.StarCount}} {{.IsOfficial}} {{.IsAutomated}}” | |
–limit 2 # 仅显示2条结果 | |
–no-trunc | |
docker pull mysql:latest | |
docker rmi -f {{.ImageID}} | 删除指定容器,空格分隔 |
docker rmi -f $(docker images -aq) | 删除全部容器 |
docker images -a --digests --format="{{.ID}} {{.Repository}} {{.Tag}} {{.Size}} {{.CreatedAt}} {{.CreatedSince}}" --no-trunc
docker search java --format "{{.Name}} {{.StarCount}} {{.IsOfficial}} {{.Description}}" --limit 2 --no-trunc
# docker pull 分层下载,联合文件系统
docker pull mysql
# 等价于
docker pull docker.io/library/mysql:latest
docker__109">3. docker 容器命令
docker pull centos
docker run [args] imageID
# args
--name="Name" # 为运行的容器指定一个名字
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 0.0.0.0:主机端口:容器端口
-P # 随机指定端口
# e.g.
docker run -it centos /bin/bash
# 运行的容器
docker ps
-a # 列出当前正在运行的容器+历史运行过的容器
-n=1 # 最近运行的一个容器
-q # 仅显示容器的编号
# 容器不停止退出
docker run -it {{ImageID}}
Ctrl + P + Q
# 删除指定容器
docker rm -f {{ContainerID}}
# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -aq|xargs docker rm
# 启动停止容器
docker restart {{ContainerID}}
docker stop {{ContainerID}}
# 强制停止容器
docker kill {{ContainerID}}
docker__148">4. docker 日志,元数据,进程查看
# docker容器使用后台运行时,docker若发现前台无应用,则会停止该容器
docker run -itd centos
# 查看最近10条日志 -t:显示时间戳;-f持续输出
docker logs -f -t --tail 10 {{ContainerID}}
# 运行临时脚本
docker run -d centos /bin/sh -c "while true;do echo liyuan;sleep 1;done"
# 查看进程信息
docker top {{ContainerID}}
# 查看docker元数据
docker inspect {{ContainerID}}
# 进入当前容器
docker exec -it {{ContainerID}} /bin/bash
#进入容器中所指定执行的命令行
docker attach {{ContainerID}}
# 容器和宿主机间文件传输
docker cp 容器ID:容器内路径 目的主机路径
dockernginxtomcat_eskibana_177">5.docker部署nginx,tomcat, es+kibana
docker search nginx
docker pull nginx
# 记得开启云服务器安全组对应端口
docker run -d --name nginx01 -p 31234:80 nginx
# --rm 用完该容器就删除该容器
docker run -it --rm tomcat:9.0
# 将webapps.dist 中内容 复制到 webapps 中
# elasticsearch -e 环境变量
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# kibana
mkdir -p /data/elk/config/
vim /data/elk/config/kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://172.18.0.1:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
docker run -d -p 5601:5601 -v /data/elk/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.5.1
# 检查docker运行的程序耗费的资源
docker stats
docker_211">6.docker可视化界面
docker run -d -p 8088:9000 -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
docker_218">7.docker镜像讲解
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件;
7.1.联合文件系统
UnionFS:是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录故在到同一个虚拟文件系统下,为Docker镜像基础,可通过分层来进行继承,用于基础镜像,可以制作各种具体的应用镜像;
特点:一次性加载多个文件系统,但从外部来看,只能看到一个文件系统,连个加载会将各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录;说白了就是公共用
(1)bootfs(boot file system):主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成后整个kernel都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs;
(2)rootfs(root file system): 在bootfs之上,就是典型的Linux系统的/dev, /proc, /bin, /etc 等标准目录以及文件,rootfs是各种不同操作系统发行版,如ubuntu,CentOS;容器就是一个小的虚拟机;
理解:
所有镜像均起始于一个基础镜像;
8.提交自己的镜像
docker commit -m="${message}" -a="${author}" ${containerID} ${Repository}:${version}
docker__238">9.docker 数据卷挂载
# 具名挂载
docker run -it -v ${主机内目录}:${容器内目录}:${操作权限} ${imageID}
# ro: readonly 仅可从外部挂载位置改变
# rw: readwrite
docker run -d --name nginx01 -v test:/etc/nginx:ro nginx
# 匿名挂载
docker run -it -P -v /etc/nginx nginx
# 查看所有匿名挂载卷的情况
docker volume ls
# 所有匿名卷都挂载在 /var/lib/docker/volumes 下
10.Dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
docker build -f ./df-1 -t liyuan-centos:v0.0.1 .
docker run -it ${imageID} /bin/bash
# 多个容器卷之间数据同步
docker run -it --name docker01 liyuan-centos:v0.0.1
docker run -it --name docker02 --volume-from docker01 liyuan-centos:v.0.0.1
# docker01和dcker02之间的挂载卷共享数据
# --volumes-from 挂载卷之间的继承
# 多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql5.7
11.Dockerfile指令
命令 | 解释 |
---|---|
FROM | 基础镜像,一切从这里开始构建 |
MAINTAINER | 姓名<邮箱> |
RUN | 镜像构建时需要运行的命令 |
ADD | 添加内容,如tomcat镜像 |
WORKDIR | 镜像工作目录 |
VOLUME | 挂载卷 |
EXPOSE | 指定暴露端口配置 |
CMD | 指定容器启动时要运行的命令,仅最后一个会生效,可被替代 |
ENTRYPOINT | 可追加命令 |
ONBUILD | 当构建一个被继承Dockerfile时,会允许ONBUILD指定的命令 |
COPY | 将宿主机上的文件拷贝到镜像中 |
ENV | 构建时设置环境变量 |
11.1实战
FROM centos
MAINTAINER liyuan<1987151116@qq.com>
ENV MYPATH /usr/local
# 切换工作目录
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#11.2.本地镜像构建历史
docker history ${imageID}
# dockerfile-test
FROM cetnos
CMD ["ls","-a"]
docker build -f dockerfile-test -t test:0.0.0
# CMD指定的命令会被后来追加的命令覆盖掉
# 原: ls -a 现: ls -l
docker run ${imageID} ls -l
FROM cetnos
ENTRYPOINT ["ls","-a"]
# ENTRYPOINT 指定的命令不会被覆盖掉,会拼接到命令后面
# 原: ls -a 现: ls -al
docker run ${imageID} ls -l
FROM centos
MAINTAINER liyuan<1987151116@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jre1.8.0_321.tar.gz /usr/local/
ADD apache-tomcat-9.0.58.tar.gz /usr/local
#RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jre1.8.0_321
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.58
ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin:$JAVA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/logs/catalina.out
docker run -itd -p 0.0.0.0:12346:8080 --name tomcat03 -v /root/docker-tomcat/webapps:/usr/local/apache-tomcat-9.0.58/webapps -v /root/docker-tomcat/logs:/usr/local/apache-tomcat-9.0.58/logs mytomcat:v0.0.1
docker login -u yuanxi2314
docker tag mytomcat:v0.0.1 yuanxi2314/mytomcat:v0.0.1
docker push yuanxi2314/mytomcat:v0.0.1
12.Docker网络
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images)
docker会为每隔容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用 evth-pair技术;
12.1.evth-pair
为一堆的虚拟设备接口,通常成对出现,一端连接协议,一端彼此相连;
充当桥梁,连接各种虚拟设备
OpenStac,Docker容器间的连接,OVS的连接,都是使用evth-pair技术;
容器间的通信并不是直接连接的,而是通过宿主机的docker0网卡做一层转发;
255.255.0.1/24
表示前24位作为超网
后8位作为可分配的地址
docker run -itd -p 0.0.0.0:12348:8080 --link tomcat03 --link tomcat07 --name tc -v /root/docker-tomcat/webapps:/usr/local/apache-tomcat-9.0.58/webapps -v /root/docker-tomcat/logs:/usr/local/apache-tomcat-9.0.58/logs mytomcat:0.0.1
docker network ls
# 本质为host映射
12.2.自定义互联
网络模式 | 解释 |
---|---|
bridge | 桥接网络 docker0 |
none | 不配置 |
host | 和宿主机共享 |
container | 容器网络联通(局限大) |
docker network --help
docker run -d -P --name tomca00 --net bridge tomcat
# 创建网络
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet
docker network ls
# 使用自定义网络
docker run -d -P --name tc01 --net mynet mytomcat:0.0.1
docker network inspect mynet
# 自定义的网络会保留域名以及ip的映射
# 将容器加入到一个网络中
# 给容器添加一张虚拟网卡
docker network connect mynet tomcat01
dockerredis_425">13.docker部署redis集群
分片 + 高可用 + 负载均衡
docker network create redis --subnet 172.38.0.0/16
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf/redis.conf
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}\
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
docker run -p 6371:63799 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
14. Docker Compose
官方文档
批量编排管理容器,定义控制多个容器;
(1)定义Dockerfile
(2)定义docker-compose.yml
(3)运行 docker-compose up
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- v1:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
docker_compose_480">14.1. 安装docker compose
sudo curl -L "https://get.daocloud.io/docker/compose/releases/dow
nload/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
docker_compose_yaml_490">14.2.docker compose yaml规则
Docker Compose File 语法官方文档
e.g.搭建Wordpress开源博客
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
15. Docker swarm
docker service create -p 8888:80 --name nginx --replicas nginx
docker service update nginx --replicas 4
docker service scale nginx=1
# 加入主节点
docker swarm join-token manager
# 加入子节点
docker swarm join-token worker
docker_swarm_539">15.2.docker swarm概念
Swarm: 集群的管理和编排;
Node: docker 节点
Service: 可在管理节点或工作节点来运行
Task: 容器内的命令
e.g.
version: "3.5"
services:
web:
image: example/web:1.0
deploy:
replicas: 4
docker service create --mode global --name hello alpine ping www.baidu.com
网络模式 | 解释 |
---|---|
Overlay | 将所有Pod互联成一个整体 |
Ingress | 特殊Overlay网络,具有负载均衡功能 |
15.3.Docker Stack
#单机
docker-compose up -d wordpress.yml
#集群
docker stack deploy wordpress.yml
15.4. Docker Secret
# 安全配置
15.5.Docker COnfig
# 云原生时代
# Golang