文章目录
- 我的`docker`环境
- 替换`apt`软件包镜像源
- `docker`安装
- 以`apt`包管理器安装`docker`
- 卸载
- 以`docker`官方存储库安装
- 卸载
- 添加某用户到`docker`组
- 配置`docker`镜像
- `docker`命令学习
- 操作守护进程相关命令
- 操作镜像相关命令
- 查看镜像
- 搜索镜像
- 拉取镜像
- 删除镜像
- 操作容器相关命令
- 查看容器
- 创建容器
- 进入容器
- 启动容器
- 停止容器
- 删除容器
- 查看容器信息
- 容器的数据卷
- 数据卷的概念以及作用
- 概念
- 作用
- 配置数据卷
- 数据卷概念
- 部署应用案例
- 部署`mysql`
- 部署`tomcat`
- 部署`nginx`
- `Dockerfile`
- `docker`镜像原理
- 镜像制作
- 容器转为镜像
- `dockerfile`
- `dockerfile`关键字
- 案例
- 搭建一个`springboot`的环境
- 自定义`centos`
- `docker`服务编排
- 服务编排概念
- `Docker Compose`概述
- 一、安装`Docker Compose`
- 二、卸载`Docker Compose`
- 三、 使用docker compose编排nginx+springboot项目
我的docker
环境
Ubuntu 20.04.6 LTS
替换apt
软件包镜像源
修改/etc/apt/source.list
中所有的
http://cn.archive.ubuntu.com/ubuntu
->
https://mirrors.tuna.tsinghua.edu.cn/ubuntu
cd /etc/apt
# 备份文件
cp source.list source.list.package
# 替换镜像源
sed -i 's/http:\/\/cn\.archive\.ubuntu\.com\/ubuntu\//https:\/\/mirrors\.tuna\.tsinghua\.edu\.cn\/ubuntu\//g' source.list
docker
安装
以apt
包管理器安装docker
sudo apt install docker.io
卸载
如果要卸载
sudo apt-get purge docker.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
以docker
官方存储库安装
- 更新 apt 包索引,并且安装一些软件使得apt可以通过HTTPS协议访问软件库。
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加
docker
官方的GPG
秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置一个标准的
docker
软件仓库。
# 会在/etc/apt/source.list.d/添加一个叫docker.list的文件
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/dockerarchive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 更新
apt
包索引并查看docker
可用版本列表
sudo apt-get update
apt-cache madison docker-ce
-
安装docker
-
安装特定版本docker语法,例如:
5:24.0.2-1~ubuntu.18.04~bionic
sudo apt-get install docker-ce=<VERSION_STRING> \ docker-ce-cli=<VERSION_STRING> \ containerd.io=<VERSION_STRING> \ docker-compose-plugin=<VERSION_STRING>
使用具体版本号代替
sudo apt-get install docker-ce=5:24.0.5-1~ubuntu.20.04~focal \ docker-ce-cli=5:24.0.5-1~ubuntu.20.04~focal \ containerd.io=1.6.21-1 \ docker-compose-plugin=2.20.2-1~ubuntu.20.04~focal
-
或者直接安装最新版
docker-ce
及相关软件sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
-
检查
docker engine
是否安装正确sudo docker run hello-world
卸载
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
删除相关目录
sudo rm -rf /var/lib/docker && sudo rm -rf /var/lib/containerd && sudo rm -rf /etc/docker/
添加某用户到docker
组
为了不让每次输入
docker
指令都输入sudo
我们讲用户添加到docker
组// 将用户从docker用户组中移除 gpasswd -d <username> docker // 将用户添加到docker 用户组 sudo addgroup -a <username> docker sudo service docker restart // 查看用户信息 id <username>
配置docker
镜像
在
/etc/docker/daemon.json
添加镜像源{"registry-mirrors": ["https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] }
docker
命令学习
操作守护进程相关命令
systemctl 操作 dockersystemctl enable docker # 开机启动docker
操作镜像相关命令
查看镜像
docker imagesdocker images -q # 显示所有的镜像id
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
仓库(镜像名称) | 版本 | 镜像id (删除时会用) | 创建时间 | 大小 |
搜索镜像
docker search xxxx
在网络上搜索镜像包
拉取镜像
docker pull redis:7.0
- 可以指定版本也可以不指定,不指定的话默认
latest
删除镜像
docker rmi redis
- 可以写名称:版本,也可以写
image id
操作容器相关命令
查看容器
docker ps
显示出正在运行的容器列表
docker ps -a
显示出历史所有运行过的容器列表
docker ps -aq
显示出所有历史运行过的容器列表id
创建容器
docker run -it --name=c1 redis:latest /bin/bash
-i
表示保持容器运行,如果不加的话容器默认状态就为exit
-t
为容器重新分配一个伪输入终端,exit
后容器关闭--name=xx
分配名字redis:latest
指定镜像/bin/bash
进入容器的初始化指令
docker run --id --name=c2 redis:latest
返回容器id
-d
以守护模式运行容器。创建一个容器在后台运行,使用exit
退出后容器不会关闭
-it
创建一个交互式容器,-id
创建一个守护式容器
进入容器
docker exec -it c2 /bin/bash
- 以交互的终端方式进入
c2
启动容器
docker start c2
- 启动
exit
状态的容器
停止容器
docker stop c2
- 关闭已经启动的容器
删除容器
docker rm c1
- 从容器列表中删除容器
docker rm `docker ps -aq`
- 删除所有容器
查看容器信息
docker inspect c2
容器的数据卷
数据卷的概念以及作用
概念
宿主机上有数据卷目录,容器内部也有数据卷目录,容器内部的数据卷目录挂载的是宿主机上的数据卷目录。所以可以回答下面三个问题
docker
容器删除后,在容器中产生的数据也会随之销毁吗- 相当于不挂载了,只要宿主数据卷还在就行
docker
容器和外部机器可以直接交换文件吗- 外部机器与宿主的数据卷进行交互间接修改
docker
容器数据
- 外部机器与宿主的数据卷进行交互间接修改
- 容器之间想要进行数据交互
- 不同容器间挂载可以挂载同一个宿主数据卷
一个数据卷可以被多个容器挂载
一个容器可以挂载多个数据卷
作用
- 容器数据持久化
- 外部机器和容器间通信
- 容器之间数据交换
配置数据卷
docker run -it --name=c1 -v /root/data:/root/data_container redis:latest /bin/bash
-
挂载路径需要写绝对路径
-
如果目录不存在会自动创建
-
可以挂载多个数据卷
docker run -it --name=c1 \ -v /root/data:/root/data_container \ -v /root/data1:/root/data1 \ redis:latest \ /bin/bash
数据卷概念
c3
挂载了一个数据卷,c1
和c2
分别挂载了c3
,那么他们也相当于挂载到了对应的数据卷
此时c3
就叫做数据卷容器
docker run -it --name=c3 -v /volumn redis:latestdocker run -it --name=c2 --volumn-from c3 redis:latest
docker run -it --name=c1 --volumn-from c3 redis:latest
部署应用案例
部署mysql
-
搜索应用
docker search mysql
-
拉取
mysql
镜像docker pull mysql:5.6
-
创建容器,设置端口映射、目录映射
mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --name=c_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:logs \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
- 映射端口
- 目录映射
- 设置
mysql
密码
进入容器
docker exec -it c_mysql /bin/bash
部署tomcat
mkdir ~/tomcat
cd ~/tomcatdocker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
- 设置
webapp
映射目录 - 映射端口
部署nginx
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
Dockerfile
docker
镜像原理
为什么centos
镜像只有200MB
,而一个centos
操作系统要几个G
为什么tomcat
镜像有500MB
,而一个tomcat
安装包只有几十兆
docker
是一个分层的文件系统- docker的镜像复用宿主机的
bootfs
,自己只要有rootfs
和其他镜像层
镜像制作
容器转为镜像
docker commit 容器id 镜像名称:版本号
将镜像打成压缩包
docker save -o 压缩文件名称 镜像名称:版本号
将压缩包转为镜像
docker load -i 压缩文件名称
目录挂载的需要重新docker run
的时候使用-v
指定
dockerfile
一个文本文件,包含了一条条的指令。
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。
dockerfile
关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
案例
搭建一个springboot
的环境
创建一个springboot
的项目,jdk
使用8
,maven
打包成jar
包传给ubuntu
在jar
包目录下创建dockerfile
# springboot_dockerfile
FROM java:8
MAINTAINER ljq <luopanforever@163.com>
ADD springbootDocker-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
加载dockerfile
文件
docker build -f ./springboot_dockerfile -t app .
创建容器
docker run -id -p9000:8080 app
自定义centos
设置默认登录路径为/usr
可以使用vim
docker
服务编排
服务编排概念
按照一定的业务规则批量管理容器
Docker Compose
概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
- 利用
dockerfile
定义运行环境镜像 - 使用
docker-compose.yml
定义组成应用的各服务 - 运行
docker-compose up
启动应用
一、安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
二、卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
三、 使用docker compose编排nginx+springboot项目
- 创建
docker-compose
目录
mkdir ~/docker-compose
cd ~/docker-compose
- 编写
docker-compose.yml
文件
version: '3'
services:nginx:image: nginxports:- 80:80links:- appvolumes:- ./nginx/conf.d:/etc/nginx/conf.dapp:image: appexpose:- "8080"
- 创建
./nginx/conf.d
目录
mkdir -p ./nginx/conf.d
- 在
./nginx/conf.d
目录下 编写itheima.conf
文件
server {listen 80;access_log off;location / {proxy_pass http://app:8080;}}
- 在
~/docker-compose
目录下 使用docker-compose
启动容器
docker-compose up
- 测试访问
http://192.168.149.135/hello