关于Docker
docker官方文档https://docs.docker.com/engine/install/ubuntu/
docker 全球镜像仓库https://hub.docker.com/
1、docker的安装
1.1、卸载旧版
首先如果系统中已经存在旧的Docker,先卸载: 但是不同的系统,卸载方式不一样!!!
Ubuntu系统:
apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 删除无用的相关的配置文件
apt-get autoremove docker-ce-*
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
docker --version # 检查是否存在
1.2、安装docker
不同版本,安装步骤也不一样。具体看官网!!!
Ubuntu:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装最新版
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证
sudo docker run hello-world
# 添加docker用户组 比如:zyp用户
sudo usermod -aG docker zyp
1.3、启动docker服务
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
1.4、配置镜像加速器
这里举例阿里云镜像加速器
首先访问阿里云网站:
https://www.aliyun.com/
注册一个账号。
docker命令
举例解读一个命令含义
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
docker run
创建并运行一个容器,-d
是让容器在后台运行--name
给这个容器取名,必须唯一-p
端口映射,在这是云服务器的3307端口,与容器内的3306映射。为什么要映射?因为容器内部对外不可访问-e KEY=VALUE
设置环境变量- 最后是指定运行镜像的名称 后面通过冒号
:
可以接版本号,不写的话就是最新版。
常见命令大全
说明: **IMAGE_NAME:TAG **表示 镜像名称 :版本号
CONTAINER 表示 容器名称
镜像相关:
docker pull IMAGE_NAME:TAG
docker images
docker rmi IMAGE_NAME:TAG
docker commit CONTAINER IMAGE_NAME:TAG
创建某个container的镜像docker save -o XXXXXX.tar **IMAGE_NAME:TAG**
将镜像IMAGE_NAME:TAG导出到本地文件XXXXX.tar中docker load -i **XXXX.tar**
将镜像IMAGE_NAME:TAG 从本地文件XXXX.tar中加载出来
容器相关:
docker run -itd **IMAGE_NAME:TAG**
将一个镜像创建成容器,并运行(可以添加参数 如, -d -i -t)- -i 以交互方式运行容器,通常与-t 同时使用
- -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- 即启动交互式容器,一般是 bash
- -d 后台运行容器,即启动守护式容器
docker ps -a
查看本地所有容器docker start CONTAINER
启动容器docker stop CONTAINER
停止容器docker restart CONTAINER
重启容器docker attach CONTAINER
进入容器- 先按Ctrl-p,再按Ctrl-q可以挂起容器
docker exec -it CONTAINER bash
进入该容器执行命令docker rm **CONTAINER**
删除某个容器docker inspect **CONTAINER**
查看某个容器详情,包括数据卷
docker attach 与docker exec 区别:是否开启一个新的进程
- docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
- docker attach 进入容器正在执行的终端(前提 run 的时候 有-it),不会启动新的进程
数据卷
概念
数据卷是一个虚拟文件夹,它将宿主机的文件夹映射到容器内的文件夹,方便操作容器内的文件
常见命令:
- docker volume create 创建数据卷
- docker volume ls 查看所有数据卷
- docker volume rm 删除指定的数据卷
- docker volume inspect 查看某个数据卷的详情
- docker volume prune 清除数据卷
如何挂载数据卷?
- 不需要通过命令去主动创建数据卷,当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
- 在docker run 命令创建容器时,添加参数
-v **数据卷名**:**容器内文件夹**
进行数据卷的挂载
直接数据挂载宿主机文件夹(不通过数据卷)
- 在执行dockerrun命令时,使用
-v **本地目录**:**容器内目录**
可以完成本地目录挂载 - 本地目录必须以 "/" 或 " ./ ”开头,如果直接以名称开头,会被识别为数据卷而非本地目录
- -v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql (错误)
- -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录 (正确)
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像
这里举一个例子:
假设我们现在有一个springboot项目打包好的jar包“my_back.jar”,现在要写一个dockerfile文件
#
FROM openjdk:11.0-jre-buster
#
ENV TZ=Asia/Shanghai
RUN ln -snf/usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#
COPY my_back.jar /app.jar
#
ENTRYPOINT ["java", "-jar", "/app.jar"]
注意: openjdk的版本
在云服务器中,我们需要把dockerfile文件和my_back.jar文件放到同一级目录下,然后
如果我们直接在当前目录下通过dockerfile文件构建镜像:**docker build -t IMAGE_NAME .**
这样,我们的自定义的一个java应用的镜像就构建好了!!!
docker网络
默认情况下,所有的容器都是以bridge的方式连接到Docker的一个虚拟网桥上
由于,当容器重新启动时,容器分配的IP地址会改变,所以容器之间通过内部IP地址互联是不现实的。
于是,我们需要自定义docker网络。
自定义网络示例:
假设现在宿主机中已经有,A,B两个容器,以及还没有创建成容器的镜像C
- 创建一个网络,起名为 “ **my_net ” **
docker network create my_net
- 将名为A的容器加入网络
docker network connect my_net A
- 将名为B的容器加入到网络
docker network connect my_net B
- 也可以在容器创建启动的时候直接加入到网络中,比如C镜像创建成容器
docker run -d --name C -p 8080:8080 --network my_net **IMAGE_NAME:TAG**
DockerCompose
DockerCompose通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的docker容器的快速部署。
举一个例子:
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
evironment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: xxxxxxx
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- my_net
spingboot_backend:
build:
context: .
dockerfile: Dockerfile
container_name: my_backend
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- my_backend
networks:
- my_net
networks:
my_net:
name: my_net
可以发现, dockercompose.yaml文件的很多地方与docker run 命令后面的那一大段类似。
**docker compose [OPTIONS] [COMMANDS]**