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 要点

  • DockerC/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 镜像。

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
posted @ 2022-07-26 09:27  Soul-Q  阅读(100)  评论(0编辑  收藏  举报