docker安装: 安装Docker - 飞书云文档 (feishu.cn)
docker命令解读
docker run -d \
> --name mysql \
> -p 3306:3306 \
> -e TZ-Asia/Shanghai \
> -e MYSQL_ROOT_PASSWORD=123 \
> mysql:5.7
· docker run:创建并运行一个容器,-d是让容器在后台运行
· --name mysql :给容器起一个名字,必须唯一
· -p 3307:3306:设置端口映射,宿主机端口映射到容器的端口
· -e TZ-Asia/Shanghai 和 -e MYSQL_ROOT_PASSWORD=123:环境变量,由镜像的创建者定义,在Docker Hub Container Image Library | App Containerization中查询
· mysql :5.7:指定运行的镜像的名字( 不写版本的话默认最新版本)
docker常见命令:
docker pull:从镜像仓库拉取到本地
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker pull nginx
docker images:查看所有的本地镜像
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
mysql latest 3218b38490ce 2 years ago 516MB
docker rmi:删除镜像
docker build:自定义镜像
docker save:将镜像打包成一个压缩文件
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker save -o nginx.tar nginx:latest
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# ll
total 2167864
-rw-r--r-- 1 root root 0 Jul 5 20:54 ??ՙ?n?
-rw------- 1 root root 145902080 Sep 30 16:37 nginx.tar
docker load:将压缩文件解压成镜像
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker load -i nginx.tar
2edcec3590a4: Loading layer [==================================================>] 83.86MB/83.86MB
e379e8aedd4d: Loading layer [==================================================>] 62MB/62MB
b8d6e692a25e: Loading layer [==================================================>] 3.072kB/3.072kB
f1db227348d0: Loading layer [==================================================>] 4.096kB/4.096kB
32ce5f6a5106: Loading layer [==================================================>] 3.584kB/3.584kB
d874fd2bc83b: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:latest
docker push:将镜像推送到镜像仓库
docker run:创建并运行容器
docker stop:停止容器的进程
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker stop nginx
nginx
docker start:启动容器的进程
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker start nginx
nginx
docker ps:查看当前容器的运行状态
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f490131959f nginx "/docker-entrypoint.…" 2 minutes ago Up 4 seconds 0.0.0.0:80->80/tcp nginx
docker rm:删除容器
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker rm mysql
mysql
docker logs:查看容器日志(停下使用Ctrl+C)
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker logs -f nginx
docker exec:进入容器内部
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker exec -it nginx bash
root@3f490131959f:/#
命令的别名:
进入编辑模式
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# vi ~/.bashrc
自定义命令别名
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
使别名生效
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# source ~/.bashrc
数据卷:
数据卷(volume)是一个虚拟目录。是容器内目录于宿主机目录之间的映射桥梁
创建数据卷:/var/lib/docker/volume/html/_data
以利用nginx容器部署静态资源为例
相关命令:
docker run -v:挂载数据卷
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker run -d \
> --name nginx \
> -p 80:80 \
> -v html:/usr/share/nginx/html \ #挂载数据卷
> nginx
docker volume create :创建数据卷
docker volume ls:查看所有数据卷
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker volume ls
docker volume rm:删除指定数据卷
docker volume inspect :查看某个数据卷详情
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker volume inspect html
[
{
"CreatedAt": "2024-10-01T16:49:55+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/html/_data",
"Name": "html",
"Options": null,
"Scope": "local"
}
]
docker volume prune :清除数据卷
docker inspect:查看容器是否有数据卷挂载
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker inspect mysql
连接Docker容器中的mysql时要注意端口在防火墙和阿里云是否可见
数据挂载:
基于宿主目录实现mysql数据目录,配置文件,初始化脚本的挂载
挂载/root/mysql/data到容器内的/var/lib/mysql
挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录
挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录
在执行docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录的挂载
[root@iZ2vcduzd0jmjyj0gisbvzZ mysql]# docker run -d \
> --name mysql \
> -p 3307:3306 \
> -e MYSQL_ROOT_PASSWORD=123 \
> -v /root/mysql/data:/var/lib/mysql \
> -v /root/mysql/init:/docker-entrypoint-initdb.d \
> -v /root/mysql/conf:/etc/mysql/conf.d \
> mysql
自定义镜像:
镜像结构:层(Layer)
镜像分层的好处:相同的层不用重复下载,节省了空间
Dockerfile:
Dockerfile就是一个文本文件,其中包含多条指令(instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile来构建镜像。
常见指令如下:
编写好Dockerfile之后使用以下docker命令创建自己的镜像
docker build -t myImage:1.0 .
· -t:是指定镜像名,格式为repository:tag的格式,不指定tag时,默认为latest
· .: 是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
Docker网络互联:
默认,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker inspect dd
"IPAddress": "172.17.0.4",
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker inspect mysql
"IPAddress": "172.17.0.3",
加入自定义网络的容器才可以通过容器名相互访问,Docker的网络操作命令如下:
创建自有网络:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker network create demo
查看所有网络:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker network ls
将指定容器添加到网络:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker network connect demo mysql
查看网络:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker inspect demo
创建容器时将其添加到网络:
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker run -d \
> --name dd \
> -p 8080:8080 \
> --network demo \
> docker-demo
nginx
[root@iZ2vcduzd0jmjyj0gisbvzZ ~]# docker run -d \
> --name dd \
> -p 18080:18080 \
> -p 18081:18081 \
> -v /root/hmsc/nginx/html:/usr/share/nginx/html \
> -v /root/hmsc/nginx/nginx.conf:/ect/nginx/nginx.conf \
> --network demo \
> docker-demo
DockerCompose:
Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助实现多个相互关联的Docker容器的快速部署
注:使用docker compost之前先安装docker compost
使用命令行部署mysql
#使用命令行创建Docker容器
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
--network demo \
mysql
使用DockerCompose部署mysql
#使用yml指定DockerConpose部署的Docker容器
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
network:
- hmall
使用DockerCompose创建一系列Docker容器
compose.yml文件
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
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:
- hmall
networks:
- hm-net
#统一定义网络名称
networks:
hm-net:
name: hmall
使用docker compost命令来指定compost文件来构建docker容器
docker compost up \
-f . \
-p hmsc \
-d