docker
简介
- 官网:docker.com
- 在操作系统层面实现虚拟化,直接复用本地主机的操作系统。占用体积小、启动速度快。
- 对进程进行隔离,将软件运行所需的所有资源打包到一个隔离的容器中。
跨机器通讯
- 链接: link
三要素
镜像(image)
- 狭义:一个只读的模板,用来创建 Docker 容器,一个镜像可以创建很多容器(类似于Java的类,一个类可以用来new多个对象,docker容器实例类似于java中new出来的实例对象)。
- 广义:程序和配置打包成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是镜像文件。
容器(container)
- 类似于一个虚拟化的运行环境,独立运行一个或一组应用,应用程序运行在容器里面。
仓库(repository)
- 集中存放镜像文件的场所。
- 最大的公开仓库是 Docker Hub(https://hub.docker.com/)。国内的公开仓库有阿里云 、网易云等。
安装
- 如果安装过卸载旧版本。
- 设置仓库。
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引,以后yum安装就会快一些。
yum makecache fast
- 安装docker引擎
yum -y install docker-ce docker-ce-cli containerd.io
- 启动
systemctl start docker
- 查看是否启动成功
docker version
docker run hello-world
ps -ef|grep docker
- 卸载
1.systemctl stop docker
2.yum remove docker-ce docker-ce-cli containerd.io
3.rm -rf /var/lib/docker
4.rm -rf /var/lib/containerd
配置镜像加速器
- 阿里云-弹性计算-容器镜像服务-镜像工具-镜像加速器-操作文档-CentOS。
命令
启动、帮助类
- 启动docker: systemctl start docker
- 停止docker: systemctl stop docker
- 重启docker: systemctl restart docker
- 查看docker状态: systemctl status docker
- 开机启动: systemctl enable docker
- 查看docker概要信息: docker info
- 查看docker总体帮助文档: docker --help
- 查看docker命令帮助文档: docker 具体命令 --help
镜像命令
- 列出镜像:docker images
- 搜素镜像:docker search 某个XXX镜像名字
- 下载镜像:docker pull 某个XXX镜像名字
- 查看镜像/容器/数据卷所占的空间:docker system df
- 删除镜像:docker rmi 某个XXX镜像名字/ID
容器命令
- 新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
1.后台守护式启动:docker run -d redis:6.0.8 - 列出所有正在运行的容器:docker ps [OPTIONS]
- 退出容器:
1.exit(退出后容器停止)。
2.ctrl+p+q(退出后容器不停止)。 - 启动已停止运行的容器:docker start 容器ID或者容器名。
- 重启容器:docker restart 容器ID或者容器名。
- 停止容器:docker stop 容器ID或者容器名。
- 强制停止容器:docker kill 容器ID或容器名。
- 删除已停止的容器:docker rm 容器ID。
- 查看容器日志:docker logs 容器ID。
- 查看看容器内运行的进程:docker top 容器ID。
- 查看容器内部细节:docker inspect 容器ID。
- 进入容器(并以命令行交互):docker exec -it 容器ID /bin/bash
1.exec 和 attach 的区别:attach exit退出,会导致容器的停止。 - 从容器中拷贝文件到主机:
1.从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径。
2.导出容器:docker export 容器ID > 文件名.tar
3.导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 - commit:基于当前容器创建一个新的镜像。
镜像发布云端
发布到阿里云
私有库
- Docker Registry
数据卷
概念
- 宿主机的一个文件夹,可以存在于一个或多个容器中,容器中的数据可以持久化到宿主机的磁盘(挂载目录)中。
特点
- 卷可在容器之间共享或重用数据。
- 卷中的更改会实时同步到容器中, 可以实时生效。容器中的数据更改也会同步到卷中。
- 卷中的更改不会包含在镜像的更新中
- 卷的生命周期一直持续到没有容器使用它为止。
继承
- –volumes-from
mysql安装
- /etc/mysql/conf 下新建 my.cnf 文件。
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
- 启动命令
docker run -p 3306:3306 --name mysql --privileged=true -v /etc/mysql/log:/var/log/mysql -v /etc/mysql/data:/var/lib/mysql -v /etc/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
解释:
–name 自定义名称
-d mysql:5.7 后台允许xxx镜像
privileged=true
redis安装
- 新建 redis.conf 文件。
- 启动命令
docker run -p 6379:6379 --name redis --privileged=true -v /etc/redis/redis.conf:/etc/redis/redis.conf -v /etc/redis/data:/etc/redis/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
解释:
/etc/redis/redis.conf 启动时去读取此目录下的文件
mysql主从安装
redis集群配置
DockerFile
简介
- 用来构建Docker镜像的脚本文件,由一条条构建镜像所需的指令和参数构成。
常用命令
构建镜像
- 构建时将DockerFile文件和jar包放在一个文件夹下。
docker build -t 镜像名字:版本 .
模板
FROM java:8
# 作者
MAINTAINER yzx
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为docker_boot.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar docker_boot.jar
# 运行jar包
RUN bash -c 'touch /docker_boot.jar'
ENTRYPOINT ["java","-jar","/docker_boot.jar"]
#暴露6023端口作为微服务
EXPOSE 6023
虚悬镜像
- 仓库名、标签都是的镜像,俗称dangling image
- 虚悬镜像一般没有价值,可以删除。
docker网络
简介
- 用于容器间的通信。
- docker容器内部的ip是有可能会发生改变的。一个容器停止了它的ip可能会给到另外一个新启动容器。
- 可以通过服务名直接通信。
常用命令
网络模式
- Docker启动时默认会创建一个名为docker0的网桥Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
- Docker网桥是每个容器的默认网关。
bridge
- Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
- docker run 的时候,没有指定network的话默认使用的就是bridge,使用的就是docker0。
host
none
container
自定义网络
- 先新建自定义网络。
- 新建容器加入上一步新建的自定义网络。
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8 - 互相ping测试。
容器编排(docker-compose)
简介
- Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。
- 需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后只要一个命令,就能同时启动/关闭这些容器。
安装
- 尽量用3以上版本。
- docker-compose和docker的版本要匹配。
卸载
使用
- 编写docker-compose.yml文件,一般和jar包、DockerFile放在一个文件夹下,执行命令时要在docker-compose.yml所在的文件夹下。可以写多个docker-compose.yml分批编排,但是要在不同的文件夹下。
- 项目里面的mysql、redis连接地址要写成编排的服务名。
- 编排前执行检查配置命令(有问题才会有输出): dokcer-compose config -q (会输出找不到命令,不知道为啥)
- 启动命令: docker-compose up -d
文件模板(文件格式不对是个坑)
- 标准模板
version: '3.9'
services:
nginx:
container_name: "nginx"
image: nginx
ports:
- "8080:80"
volumes:
- /docker-compose/www:/usr/local/nginx/www
- /docker-compose/nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
app_net:
ipv4_address: 172.16.238.2
ipv6_address: 2001:3984:3989::2
depends_on:
- php
php:
container_name: "php"
image: php:7.4-fpm
ports:
- "9000:9000"
volumes:
- /docker-compose/www:/docker/www
networks:
app_net:
ipv4_address: 172.16.238.3
ipv6_address: 2001:3984:3989::3
redis:
container_name: "redis"
image: redis
ports:
- "6379:6379"
volumes:
- /docker-compose/redis/redis.conf:/etc/redis/redis.conf
- /docker-compose/redis/data:/data
environment:
appendonly: true
networks:
app_net:
ipv4_address: 172.16.238.4
ipv6_address: 2001:3984:3989::4
mysql:
container_name: "mysql"
image: mysql
ports:
- "3306:3306"
volumes:
- /docker-compose/mysql/conf:/etc/mysql/conf.d
- /docker-compose/mysql/logs:/logs
- /docker-compose/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
networks:
app_net:
ipv4_address: 172.16.238.5
ipv6_address: 2001:3984:3989::5
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
- 自己用的
version: '3.9'
services:
microService:
container_name: "docker_boot"
image: docker_boot:1.0
ports:
- "6023:6023"
volumes:
- /usr/local/docker/docker_boot/data:/data
networks:
- atguigu_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /etc/redis/redis.conf:/etc/redis/redis.conf
- /etc/redis/data:/etc/redis/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /etc/mysql/conf:/etc/mysql/conf.d
- /etc/mysql/log:/var/log/mysql
- /etc/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
networks:
- atguigu_net
networks:
atguigu_net:
- 带注释(模板格式不对)
# compose的版本
version: "3"
services:
# 服务名
microService:
image: docker_boot:1.0
# 容器名,不指定会自动生成,名为 docker-compose.yml所在文件夹_服务名_编号
container_name: docker_boot
ports:
- "6023:6023"
volumes:
- /usr/local/docker/docker_boot/data:/data
networks:
- atguigu_net
# 此服务要依赖下面的redis、mysql先启动
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /etc/redis/redis.conf:/etc/redis/redis.conf
- /etc/redis/data:/etc/redis/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'docker'
ports:
- "3306:3306"
volumes:
- /etc/mysql/data:/var/lib/mysql
- /etc/mysql/conf:/etc/mysql/conf.d
- /etc/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
# 创建名为atguigu_net的网络
networks:
atguigu_net: