# Docker-虚拟化容器技术
Docker是开源的应用容器引擎,Docker改变了虚拟化的方式!
三大概念
- 镜像:就像安装包一样的东西 (精简的linux+软件文件)
- 容器:Docker通过安装镜像生成的一个环境,就像应用多开一样,开启的应用环境一样的东西
- 仓库:应用市场一样的东西,远程仓库,本地仓库 ->
/var/lib/docker
# 一、Docker安装和基础命令
# 1.Docker安装
bash安装(所有得Linux平台)推荐
curl -fsSL get.docker.com -o get-docker.sh # 拉取docker官方脚本 sh get-docker.sh --mirror Aliyun # 执行脚本,使用阿里云镜像 systemctl enable docker # 把docker服务加入开机自启 systemctl start docker # 启动docker服务 restart 重启 status 状态 stop停止 # 【可选】推荐将当前用户加入docker组 groupadd docker usermod -aG docker $USER # 【可选】配置阿里云加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://09w3lr09.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17docker在Ubuntu或者deepin里都可以采用一条命令安装
# 安装 apt install docker.io # 启动docker服务 systemctl start docker # 查看是否成功 docker version
1
2
3
4
5
6CentOS安装
# 解决Failed to download metadata for repo ‘AppStream’ # Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist # 如果上述三个文件中含有 mirrorlist 字段,将这些字段进行注释,并将 baseurl 修改为国内的软件源 # 阿里云 # baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/ # 腾讯云 # baseurl=https://mirrors.tencentyun.com/centos/$releasever/BaseOS/$basearch/os/ vi /etc/yum.repos.d/CentOS-Base.repo vi /etc/yum.repos.d/CentOS-AppStream.repo vi /etc/yum.repos.d/CentOS-Extras.repo 安装Docker centos8安装docker 官方文档:https://docs.docker.com/engine/install/centos/ bash: yum-config-manager: 未找到命令 yum -y install yum-utils # 1. 查看系统版本 CentOS Linux release 8.2.2004 (Core) cat /etc/redhat-release # 2. 添加镜像源(这里是阿里的镜像源) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 3. 安装依赖 yum -y install yum-utils device-mapper-persistent-data lvm2 # 4. 安装docker-ce dnf -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm dnf -y install docker-ce docker-ce-cli --nobest # 5. 查看docker版本 docker --version Docker安装完执行dockers ps报错如下。Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?解决办法 systemctl daemon-reload systemctl restart docker.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 2.Docker启动停止
启动 Docker
systemctl start docker
1停止 Docker
systemctl stop docker
1重启 Docker
systemctl restart docker
1开机启动
systemctl enable docker
1Docker状态
systemctl status docker
1
# 3.Docker基础命令
1.信息和帮助
docker version # 版本信息
docker info # 系统信息
docker 命令 --help # 帮助命令
2
3
2.镜像命令image
镜像基础命令
docker images # 查看主机上的镜像 docker search nginx # 搜索镜像 和Docker Hub搜索一样 docker pull nginx # 下载镜像 docker rmi nginx # 删除镜像 -f 强制删除,容器也会删除 docker rmi -f $(docker images tomcat -q) # 删除所有得Tomcat镜像
1
2
3
4
5镜像打包
docker commit -m "描述信息" -a "作者信息" id|name 镜像名:tag # 将正在运行容器打包成镜像 docker save tomcat:8.0 -o /root/tomcat-8.0.tar # 备份镜像 docker load -i /root/tomcat-8.0.tar # 恢复镜像
1
2
3
3.容器命令
运行容器
docker run --name 容器名 -p 主机端口:容器端口 \ -v 主机目录:容器目录:ro \ -d ImageId或者镜像名:TAG
1
2
3-p 8080:8080
映射端口,将宿主机端口映射到容器端口-d
后台运行--name tomcat01
指定容器名称为tomcat01-v 宿主机目录:容器目录
数据卷 Volume
- 只能在容器首次启动时候设置
- 会将容器内原始数据清空,以宿主机为主内容为主
- 所有数据相关的一般都需要持久化到宿主机。切记
-v /root/apps:/usr/local/tomcat/webapps # 把宿主机/root/apps映射到tomcat容器里的/usr/local/tomcat/webapps -v /root/apps:/usr/local/tomcat/webapps:ro # 只能加在容器里 [ro] 只读read only [rw] 读写模式 -v aa:/usr/local/tomcat/webapps # aa数据卷别名,aa不存在自动创建;这种方式会保留容器内的内容 # aa默认在宿主机的/var/lib/docker/volumes/下
1
2
3
4查看容器
docker ps -a -q # -a 查看所有容器(包括未运行的) -q 只查看容器的ID docker ps # 查看正在运行的容器
1
2停止,重启,暂停容器
docker stop id|name docker kill id|name # 强制停止容器 docker restart id|name docker pause id|name # 暂停容器 docker unpause id|name # 恢复暂停容器
1
2
3
4
5移除容器
docker rm id|name docker rm -f $(docker ps -aq) # 删除所有容器 -f 强制删除(可以删除正在运行的容器)
1
2查看日志
docker logs id|name docker logs -f id|name # 查看实时日志 -t 显示时间
1
2进入容器内部
docker exec -it id|name bash # 进入正在运行的容器并且(-it)开启交互模式终端 bash是终端,也可以只写 /bin/bash exit # 退出容器 ctrl +P +Q # 容器不停止
1
2
3退出容器内和宿主机间拷贝复制文件
docker cp [宿主机文件路径] [id|name:容器目录或文件] # 宿主机拷贝到容器中 宿主机 -> 容器 docker cp [id|name:容器目录或文件] [宿主机目录或文件] # 容器中拷贝到宿主机 容器 -> 宿主机
1
2查看容器中进程信息
docker top id|name # 查看容器中进程信息 docker inspect id|name # 获取容器元信息
1
2创建虚拟网段,同一网段的容器就可以互相通信
默认情况下,Docker创建容器时把所有容器都连接在docker0网桥上,默认在docker0网桥上的所有容器间都可以使用容器内IP通信
要想使用容器id或者容器名通信,必须自定义网桥 一般一个项目新建一个网桥
- 启动容器的时候,指定网络
docker run -d --network ufs xxx
- 容器启动后,在加入网络
docker network connect ufs tomcat01
把tomcat01加入ufs网络中
docker network create -d bridge my-bridge # 创建网段,一般名称选择项目名称 docker network ls # 查看列表 docker network inspect my-bridge # 查看网段内容器信息 docker network rm my-bridge # 删除 docker network prune # 删除没有使用的网桥
1
2
3
4
5- 启动容器的时候,指定网络
清除docker环境中服务、镜像、容器、挂载卷、网络
查询docker全部数据
docker node ls docker network ls docker volume ls docker images -a docker stack ls(docker service ls) docker ps -a
1
2
3
4
5
6删除所有容器
docker rm -f $(docker ps -a -q)
1删除与正在运行的容器无关的所有资源(关闭的容器、无用的数据卷和网络)
docker system prune -a
1
# 二、Dockerfile
Dockerfile是镜像的描述文件。通过Dockerfile可以构建一个镜像。
# 1.指令说明
每条保留字必须大写,后面至少跟一个参数,指令从上到下顺序执行,#
表示注释 每条指令都会创建新的镜像层,并且提交。
保留字(大写) | 作用 |
---|---|
FROM | 当前镜像基于哪个镜像 第一个指令必须是FROM |
MAINTAINER | 镜像的作者和邮箱地址,非必需了 |
RUN | 构建镜像时需要运行的指令 |
EXPOST | 容器对外暴露的端口号,仅仅是声明一下给用户看一下,不写也可以 |
WORKDIR | 创建容器后,终端默认登录进来的工作目录 |
ENV | 构建镜像过程中设置的环境变量 |
ADD | 宿主机目录下的文件拷贝进镜像,并且会自动处理URL和解压tar包 |
COPY | 拷贝文件和目录到镜像中,和ADD类似 |
VOLUME | 设置数据卷,也属于描述类型的给使用者看一下而已 |
CMD | 指定容器启动时要运行的命令,存在多个时只要最后一个生效,多用于可以传参的 |
ENTRYPOINT | 指定容器启动时要运行的命令,多用于固定的指令 |
# 2.示例
FROM openjdk:8-jre
COPY *.jar /app.jar
CMD ["--server.port=8848"]
EXPOSE 8848
ENTRYPOINT ["java", "-jar", "/app.jar"]
2
3
4
5
docker build -t image-name:1.0
基于Dockerfile打包镜像
# 三、Docker-Compose
随着微服务等项目的发展,一个项目依赖太多的容器,每个容器之间的关系以及n多个容器编排就比较困难,于是docker-compose应运而生,可以极大的方便我们去做容器的编排。
docker-compose让我们可以站在项目的角度去管理一组容器
# 1.Docker-Compose安装
#curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# github慢死了
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
2
3
4
5
6
或者下载下来后,放到 /usr/local/bin/docker-compose
改下执行权限即可
# 2.docker-compose.yml
示例:Cloud 以及各个组件。参考了若依的 (opens new window)
项目 Project 一组关联的容器组成的一个完整业务单元
服务 Service 一个项目中的某一个容器
常用命令说明
模板命令 | 说明 |
---|---|
version | docker-compose项目版本 (opens new window) |
build | 根据Dockerfile构建镜像,并且启动 |
container_name | 指定容器名称,可以使用默认的,可以指定 |
depends_on | 解决容器启动的先后问题,当前服务不会等待被依赖的服务完全启动之后才启动 |
environment | "MYSQL_ROOT_PASSWORD=123456" 环境配置信息 |
env_file | .env 环境配置文件 docker run -e |
expose | 指定构建镜像过程中暴露的端口号 |
image | mysql:latest 指定服务使用的镜像 docker run image |
networks | 指定网桥,需要先声明 docker run --network |
ports | 宿主机和容器端口映射 docker run -p |
volumes | 数据卷映射 /root/mysql/data:/var/lib/mysql docker run -v |
restart | docker run --restart=always |
使用步骤
新建一个项目比如
ufs
新建配置文件
docker-compose.yml
version: "3.0" # docker-compose项目版本 services: apps: build: context: ./ dockerfile: Dockerfile ports: - "9001:9001" depends_on: - mysql - redis - es - mq redis: image: redis:latest ports: - "6380:6379" mysql: image: mysql:latest ports: - "3307:3306" environment: - "MYSQL_ROOT_PASSWORD=123456" # mysql设置环境参数 volumes: - /root/mysql/data:/var/lib/mysql # 配置映射路径 es: image: elasticsearch:7.12.0 ports: - "9200:9200" - "9300:9300" restart: always volumes: - /root/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml - /root/elasticsearch/data:/usr/share/elasticsearch/data - /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins mq: image: rabbitmq:management ports: - "5672:5672" - "15672:15672" environment: - "RABBITMQ_DEFAULT_USER=admin" - "RABBITMQ_DEFAULT_PASSWORD=123456"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44docker-compose命令
docker-compose up # 对整个项目里所有服务启动 docker-compose up -d mysql redis # 对项目里的mysql,redis服务启动 -d 后台启动 docker-compose down 服务Id # 关闭某个服务,同时会移除网络 docker-compose exec 服务Id bash # 同docker exec docker-compose ps # 同docker ps docker-compose restart 服务Id -t 10 # 同docker ps -t 延时10s启动 docker-compose rm -f 服务Id # 同docker rm -f 【-v】 删除数据卷 docker-compose top 服务Id # 查看top docker-compose logs -f 服务Id # docker logs -f xxx
1
2
3
4
5
6
7
8
9
-f 指定使用的compose模板文件,默认为当前目录下的docker-compose.yaml文件,可以多次指定
# 四、Docker可视化工具
第三方公司提供的开源Portainer项目,用来对docker引擎中运行的所有容器可视化展示
docker run -p 8000:8000 -p 9000:9000 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/portainer/data:/data \
-d portainer/portainer
2
3
4
5
6