Docker
Docker 历史
- 2010年在美国的
dotCloud
的公司——Pass
的云计算、LXC
有关的容器技术。 - 2013年开源、引起行业的注意:
VM
(虚拟机) ==> Docker,本质都是虚拟化技术,虚拟机比较笨重,而Docker轻巧。 - 2014年4月9日,Docker 1.0 发布。
为什么是Docker ?
-
由于应用部署过程中的应用环境、应用配置繁琐(Redis、MySQL、jdk),尤其是集群的部署——繁琐而重复的工作,而Docker可以减少部署的工作时间、便于管理、减少服务器的开销。
-
Docker 与 虚拟机:
- 虚拟机:是虚拟出一个硬件、运行一个完整的操作系统,缺点系统占用的资源十分多、步骤繁琐、性能慢。
- Docker : 利用宿主的内核、没有虚拟硬件,轻巧。
-
传统 Vs Docker:交付和部署
- 传统:帮助文档、安装程序,环境不一致问题。
- Docker:打包
镜像
发布测试、一键运行、简便升级和扩缩容、环境相对一致,节省系统资源。
Docker 是什么?
-
Docker 是开源的软件部署解决方案,基于Go语言并遵循Apache 2.0 协议开源。。
-
Docker 是轻量级的应用容器架构,可以
打包
、发布
、运行
到任何的应用。 -
Docker 容器是完全使用沙箱机制进行隔离,相互之间不会有接口,容器性能开销极低。
-
应用:
CI/CD
,即持续集成
、持续交付
、持续部署
。- Web应用的自动化打包、测试、集成、发布。
-
优点:
- 快速,一致地交付您的应用程序。
- 响应式部署和扩展。
- 在同一硬件上运行更多工作负载。
Docker 安装与卸载
#CentOS 安装
#国内 daocloud 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
#卸载旧版信息
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#设置仓库
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
#设置为国内仓库:阿里云
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
sudo yum makecache fast
# 安装 Docker-ce 社区版、
sudo yum install docker-ce docker-ce-cli containerd.io
#启动 Docker
sudo systemctl start docker
#检验安装是否成功
docker version
#运行
docker run hello-world
#阿里云服务器的机器、可以配置镜像加速器
#CentOS 卸载
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#删除资源
rm -rf /var/lib/docker
Docker 要点
- Docker是
C/S
架构系统。
Docker daemon
- Docker daemon(dockerd):
守护进程
监听Docker API的请求,并管理Docker对象(镜像、容器、网络、数据卷),支持与其他守护进程通信以管理Docker服务。
Docker Client
-
Docker Client(docker):Docker 客户端是Docker用户与Docker交互的主要方式,可以与多个守护进程通信。
即操作:docker run指令时——Docker 客户端会将命令发送到
dockerd
,由dockerd
进行执行命令,
Docker Images
- Docker Image是只读模板及创建
Docker容器
的说明,可任意添加所需的应用环境和应用程序,实际基于Dockerfile
文件定义构建镜像,每个指令都会在镜像中创建一个图层,发生改变时只会更新相关的图层,与其他虚拟化技术相比,这是Docker 镜像轻量、小巧、快速的部分原因。- Example:基于
CentOS
镜像 + 安装 Apache Web 服务器 + 个人的应用程序 + 应用程序所需的配置信息的一个Docker 镜像。
- Example:基于
Docker Volumes
- 数据持久化、避免删容器跑路,即把容器生产的数据同步到宿主,避免数据丢失!
- 三种挂载方式:匿名挂载、具名挂载、指定路径挂载,具体操作请看本文”数据卷指令“。
- 数据卷容器:共享容器之间的数据、数据卷容器的生命周期是直到没有容器使用为止。
#多个Mysql实现数据共享
docker run -itd --name mysql-soul01 -p 3306:3306
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
-e MY_SQL_ROOT_PASSWORD=123456
mysql:5.7
# --volumes-form 实现数据共享
docker run -itd --name mysql-soul02 -p 3306:3306
--volumes-form mysql-soul01
-e MY_SQL_ROOT_PASSWORD=123456
mysql:5.7
- Docker 应用的Mysql、可了解数据卷的应用。
DockerFile
- 构建镜像的文件,命令参数的脚本!
FROM # 基础镜像
MAINTAINER # 作者——姓名+邮箱
RUN # 构建时需要运行的命令
ADD # 添加文件
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 端口配置
CMD # 容器启动时需要的命令(可被替代,最后一个才会生效)
ENTRYPOINT # 容器启动时需要的命令(可追加命令)
ONBUILD # 触发指令
COPY # 拷贝文件
ENV # 构建时设置环境变量
构建CentOS镜像
# 使用vim编写 Dockerfile 文件
vim Dockerfile
#Dockerfile 文件内容
FROM centos:7
MAINTAINER Soul1614212387<1614212387@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
# 构建
docker build -f dockerfile -t centos-soul:0.1 .
构建Tomcat镜像
# 使用 vim 编写 Dockerfile 文件
vim Dockerfile
#Dockerfile 文件内容
FROM centos:7
MAINTAINER Soul1614212387<1614212387@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local/
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
#构建
docker build -t Tomcat-soul .
构建 Java 项目
# Java 项目打包为 jar
# 使用 vim 编写 Dockerfile 文件
vim Dockerfile
#Dockerfile 文件内容
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port-8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
#构建镜像:项目jar包和Dockerfile在同一个目录下
docker build -t web-soul .
#运行
docker run -d -P --name web-SpringBoot web-soul
#查看项目运行的端口
docker ps
#访问项目
curl http://localhost:32112/hello
Docker 网络
Docker网络模式
桥接模式
(默认) :bridge
- 宿主共享 :
host
- 不配置网络 :none
- 容器网络连通(少用) : container
Docker网络原理
evth-pair
技术,即成对的虚拟设备接口。
Docker Compose
-
Compose 配置应用程序需要的所有服务、有序运行多容器的应用程序的工具。
-
Compose 使用的三个步骤:
- Dockerfile 定义应用程序的环境。
docker-compose.yml
配置应用程序所需的服务。- 执行
docker-compose up
命令启动并运行整个应用程序。
-
Compose 安装
#国内下载地址 curl -L https://get.daocloud.io/docker/compose/releases/download/v2.7.0/docker-compose-`uname -s`-`uname-m` > /usr/local/bin/docker-compose #配置权限 chmod +x /usr/local/bin/docker-compose #检查是否安装成功 docker-compose version
Docker compose 搭建博客
#创建博客文件夹
mkdir wordpress
#进入文件夹
cd wordpress
vim docker-compose.yml
#文件内容
services:
db:
# 获取数据库镜像
image: mariadb:10.6.4-focal
# 也可以使用 Mysql
#image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
# 启动,需要保证80,3306端口不被占用,如有请修改`docker-compose.yml`配置文件
docker-compose up -d
Docker Swarm
- Docker Swarm :Docker 集群,使用
Raft协议
,保证大多数节点存过可用——大于1,集群至少3台!
# 初始化集群
docker swarm init --advertise-addr 172.18.22.21
# 加入集群
docker swarm join --token 令牌 172.18.22.21:2377
# 获取令牌
# 获取管理节点令牌
docker swarm join-token manager
# 获取工作节点令牌
docker swarm join-token worker
#查看节点
docker node ls
#可以扩缩容
docker service 服务
Docker 常用指令
配置命令
#国内 daocloud 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
帮助命令
#docker版本信息
docker version
#docker详细信息
docker info
#帮助文档
#docker 命令 --help
docker image --help
#查看日志
docker logs -tf b750bbbcfd88 #根据容器ID查看全部日志
docker logs -tf --tail 10 b750bbbcfd88 #根据容器ID查看最近10条日志
#拷贝容器的文件到主机
#docker cp 容器ID:容器内的路径 主机路径
docker cp b750bbbcfd88:/home/test.Java /home
#查看docker内存
docker stats
镜像命令
#搜索镜像
docker search mysql
docker search mysql -filter=STARS=3000 #过滤:找3K大小以上的
#下载镜像
docker pull centos
docker pull mysql:5.7 #指定版本
#推送镜像
# 使用docker账号登陆
docker login -u Docker ID
# 创建镜像标签 ktec为Docker ID , centos 镜像名字
docker tag d13c942271d6 ktec/centos:1.0
docker push ktec/centos:1.0
#查看镜像
docker images
docker images -a #列出全部镜像
docker images -aq #列出全部镜像ID编号
#查看镜像的构建历史
docker history d13c942271d6
#删除镜像
docker rmi d13c942271d6 #指定 镜像ID 进行删除
docker rmi d13c942271d6 d13c942271d5 #指定多个 镜像ID 进行删除
docker rmi -f $(docker images -aq) #删除全部镜像
#提交镜像,即保存当前运行的容器、类似虚拟机的快照
#docker commit -m="Tomcat的默认访问目录" -a="作者" 容器ID 镜像名字:版本号
docker commit -m="Tomcat的默认访问目录" -a="Soul" b750bbbcfd88 Tomcat-dafelut:1.2
容器指令
#查看容器
docker ps #查看运行中的容器
docker ps -a #查看所有的容器
docker ps -n=10 #最近运行的10个容器
docker ps -aq #列出全部容器的容器ID编号
#启动容器
docker start b750bbbcfd88
#停止容器
docker stop b750bbbcfd88 #正常停止
docker kill b750bbbcfd88 #暴力停止
#重启容器
docker restart b750bbbcfd88
#暂停容器
docker pause b750bbbcfd88 #暂停
docker unpause b750bbbcfd88 #取消暂停
#删除容器
docker rm -f b750bbbcfd88 #删除指定的容器
docker rm -f b750bbbcfd88 b750bbbcfd87 #删除指定多个 容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#运行容器
docker run [可选参数] image
#参数说明
--name="Name" # 容器名字、区分容器
-d # 后台方式运行
-it # 交互方式运行并进入容器
-e # 配置环境变量
-v # 挂载数据卷
--net # 配置Docker网络
-p # 端口,不填则随机指定端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
#运行容器 例子
docker run -it centos /bin/bash # 运行容器、交互方式运行并进入容器
docker run -itd --name centos-test centos /bin/bash # 运行容器、并以后台进程运行且进入容器终端
docker run -d centos /bin/sh -c “while true;do echo Soul;sleep 1;done” # 运行容器、并执行shell语句
docker run -d -P webapps/web python app.py # 运行容器、并后台随机端口运行应用
docker run -d -p 8080:80 webapps/web python app.py # 运行容器、并后台指定端口运行
exit # 退出容器并停止
Ctrl + P + Q # 退出容器不停止
#进入当前运行的容器
#方式一:
docker attach b750bbbcfd88 # 不会启动新的访问终端
#方式二:常用
docker exec -it b750bbbcfd88 /bin/bash/ # 会启动新的访问终端
#查看容器的进程信息
docker top b750bbbcfd88
#查看容器元数据
docker inspect b750bbbcfd88
#导出容器
docker export b750bbbcfd88 > centos.tar
#导入容器
数据卷命令
#查看数据卷
docker volume ls
# 匿名挂载、默认在宿主:/var/lib/docker/volumes/xxxx/_data
# -v 容器内路径
docker run -itd -P --name nginx01 -v /ect/nginx/ nginx
# 具名挂载、默认在宿主:/var/lib/docker/volumes/xxxx/_data
# -v 卷名:容器内路径
docker run -itd -P --name nginx01 -v MyNginx:/ect/nginx nginx
# 设置容器操作权限:只读
docker run -itd -P --name nginx01 -v MyNginx:/ect/nginx:ro nginx
# 设置容器操作权限:可读可写
docker run -itd -P --name nginx01 -v MyNginx:/ect/nginx:rw nginx
# 指定路径挂载
# -v /宿主路径:容器内路径
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
网络指令
#查看所有Docker网络
docker network ls
#查看容器具体的网络信息
docker network inspect 容器ID
#自定义网络
# --driver bridge 桥接模式
# --subnet 192.168.0.0/16 子网最大扩容(192.168.0.2 ~ 192.168.255.255)
# --gateway 192.168.0.1 网关
# soul-net 网络名字
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 soul-net
#网络连通:即容器可以连接自定义的网络,可实现一个容器两个ip地址
# 将tomcat-big 加入到 soul-net 网络中
docker network connect soul-net tomcat-big
#检查主机是否可以连接容器
docker exec -it tomcat-soul ping 192.168.0.3
docker exec -it tomcat-soul ping tomcat-pig
#容器互联,--link 已不建议使用!
docker run -d -P --name tomcat-soul --link tomcat-pig tomcat
Docker 应用
Nginx
#0)搜索镜像
docker search nginx
#1)拉取镜像
docker pull nginx
#1.1)查看镜像
docker images
#2.1)启动Ngixn
docker run -itd --name nginx-web nginx
#2.2)后台运行,指定端口启动、寄主8080端口映射镜像的80,寄主的防火墙需要开放8080端口
docker run -itd --name nginx-web -p 8080:80 nginx
#3)查看运行的容器
docker ps
#验证访问Nginx
curl http://localhost:8080/
Tomcat
#1)拉取镜像
docker pull tomcat:9.0.65-jdk8-corretto
#2)后台运行,指定端口启动、寄主8080端口映射镜像的8080
docker run -itd --name tomcat-soul -p 8080:8080 tomcat:9.0.65-jdk8-corretto
#3)进入容器
docker exec -it tomcat-soul /bin/bash
#3.1)导入tomcat默认主页、官方默认webapps为空、
cp -r webapps.dist/* weba pps
#3.2)退出容器
exit
#4)查看运行的容器
docker ps
#5)验证访问Tomcat
curl http://localhost:8080/
MySQL
#1)拉取镜像
docker pull mysql:5.7
#2)后台运行
# -v 数据卷挂载:使用数据卷挂载mysql的配置和数据库到宿主、避免数据丢失
# -e 设置Mysql密码
docker run -itd --name mysql-soul -p 3306:3306
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
-e MY_SQL_ROOT_PASSWORD=123456
mysql:5.7
#3)进入容器
docker exec -it mysql-soul /bin/bash
#3.1)退出容器
exit
#4)查看运行的容器
docker ps
#4.1)查看占用的内存
docker stats
#5)验证访问ES
curl http://localhost:8080/
Elasticsearch
#1)拉取镜像
docker pull elasticsearch:7.17.5
#2)后台运行,es需要指定2个端口启动、-e配置参数、ES_JAVA_OPTS 配置运行时内存、否则会很卡
docker run -itd --name es-soul -p 8080:9200 -p 8081:9300
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"
elasticsearch:7.17.5
#3)进入容器
docker exec -it ES-soul /bin/bash
#3.1)退出容器
exit
#4)查看运行的容器
docker ps
#4.1)查看占用的内存
docker stats
#5)验证访问ES
curl http://localhost:8080/
Redis 集群
#创建Redis集群专门使用的网卡
docker network create redis-net --subnet 172.18.0.0/16
#通过Shell脚本创建6个Redis配置文件
for port in $(seq 1 6); \
do \
mkdir -p /souldata/redis/node-${port}/conf
touch /souldata/redis/node-${port}/conf/redis.conf
cat << EOF >/souldata/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.18.0.2${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
#通过Shell脚本启动6个Redis
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /souldata/redis/node-${port}/data:/data \
-v /souldata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.18.0.2${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done
# 配置 6 个哨兵
# 添加哨兵配置文件,由于使用Docker后台运行,所以 daemonize = no
for port in $(seq 1 6); \
do \
touch /souldata/redis/node-${port}/conf/sentinel.conf
cat << EOF >/souldata/redis/node-${port}/conf/sentinel.conf
port 26379
daemonize no
sentinel monitor soulSentinel 172.18.0.2${port} 6379 1
EOF
done
#通过Shell脚本启动6个哨兵
for port in $(seq 1 6); \
do \
docker run -p 2637${port}:26379 --name sentinel-${port} \
-v /souldata/redis/node-${port}/data:/data \
-v /souldata/redis/node-${port}/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d --net redis-net --ip 172.18.0.3${port} redis:5.0.9-alpine3.11 redis-sentinel /etc/redis/sentinel.conf; \
done
#进入任意一台Redis
docker exec -it redis-1 /bin/sh
#进入任意一台:Redis后创建集群
redis-cli --cluster create 172.18.0.21:6379 172.18.0.22:6379 172.18.0.23:6379 172.18.0.24:6379 172.18.0.25:6379 172.18.0.26:6379 --cluster-replicas 1
#Redis容器中,进入Redis
redis-cli -c
#查看集群
cluster info
#查看集群节点
cluster nodes
Docker 可视化
Portainer
- Docker 图形化界面管理工具
#安装命令
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock -privileged=true portainer/portainer