docker 命令
启动docker
1、开机自启(linux下)
bash
# 启用开机自启
sudo systemctl enable docker
# 立即启动服务
sudo systemctl start docker
# 验证是否开机自启
systemctl is-enabled docker
# 返回 enabled 即成功
2、查看docker信息
bash
docker info
3、查看容器 / 镜像的底层详细信息
- 查看容器详情
bash
docker inspect 容器名/容器ID
- 查看镜像详情
bash
docker inspect 镜像名:标签
- 只看 容器 IP
bash
docker inspect 容器名 | grep -i "ipaddress"
docker 镜像命令
1、查看本地images镜像缓存
bash
docker images
docker images -a # 列出所有镜像
docker images -q # 列出所有镜像的id
docker images -aq
2、搜索镜像文件(从官方仓库中搜索)
bash
docker search [镜像名称]
docker search -s 30 nginx # 表示start超过30的镜像
3、下载docker镜像
bash
docekr pull [镜像名称:版本号] # 如果镜像没有指定版本号,则默认下载最新版本latest
4、删除docker镜像
bash
docker rmi [镜像id]
docker 容器命令
1、运行镜像,启动容器
bash
docker run [镜像名称:版本号] # 本地images中没有此镜像时,会自动从docker hub下载
对于一些镜像,我们希望在运行时指定一些参数,比如端口映射、环境变量、挂载目录等等,那么我们就需要使用docker run命令的参数来指定这些参数。
-d: 后台运行--name: 容器名称-p: 映射端口(外部/宿主机端口:容器端口)
例如:mysql
bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \ # 启动时自动重启
mysql:8.0
也可以通过docker-compose.yml文件来启动容器,示例如下:
yml
version: '3.8'
services:
greenplum:
image: postgres
container_name: pgsql
ports:
- "5432:5432" # 默认端口
environment:
- POSTGRES_PASSWORD=123456 # 必须!解决你现在的报错
- POSTGRES_USER=root # 默认用户名
- POSTGRES_DB=postgres # 默认数据库
restart: always # 开机自启
volumes:
- ./pgsql:/data # 数据持久化(删容器不丢数据)
privileged: true # 必须开启,否则启动失败
运行 docker compose up -d,-d 表示后台运行
2、查看容器状态
bash
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括运行中和停止的)
3、进入容器内部
bash
docker exec -it [容器id] bash
进入到容器内部后,就类似进入到linux虚拟机一样,可以进行各种操作。例如:
bash
docker exec -it ca680ab9c02b bash
root@ca680ab9c02b:/# ls
bin boot data dev docker-entrypoint-initdb.d etc home lib media mnt opt proc root run sbin srv sys tmp usr var
4、停止容器
bash
docker stop [容器id]
5、删除容器
bash
docker rm [容器id]
6、批量操作
- 停止所有容器
bash
# -a 表示所有
# -q 表示只显示id
docker stop $(docker ps -aq)
- 删除所有容器
bash
docker rm -f $(docker ps -aq)
- 删除所有镜像
bash
docker rmi $(docker images -q)
7、将当前容器作为模版制作为镜像文件
bash
docker commit [容器id] [镜像名称:版本号]
-m:--message镜像描述-a:--author作者
例如:
bash
docker commit -m "my first image" -a "zhangsan" [容器id] [镜像名称:版本号]
docker 数据卷
docker数据卷,简单来说,就是docker内部的文件,映射到容器外,做一个持久化的保存。默认是双向同步的。
例如:需要给nginx容器中添加文件,可以通过exec进入到容器内部,然后上传文件。
但是这样的操作过于繁琐,所以可以通过docker数据卷,将nginx容器和外面的目录保持同步,我在外面的目录,例如(/demo)下上上传了一个html文件,nginx容器内也会有相同的文件
bash
# 参数需要写在镜像名前面
docker run -d \
--name nginx_volume \
-p 80:80 \
-v ./demo:/usr/share/nginx/html \
nginx
执行完成后,可以看到当前目录下有个demo目录,我们再到nginx容器内部查看
bash
docker ps
docker exec -it [容器id] bash

进入后ls查看发现是空的。
我们在外部demo目录下新建一个index.html,去查看nginx容器内部的/usr/share/nginx/html文件情况

此时可以看到本地的目录和nginx容器内是同步的,如果在nginx容器内部的挂载目录执行了rm -rf index.html,外面目录demo下的index.html也会被删除
Dockerfile文件
Dockerfile文件是用来构建镜像文件的,可以使用容器去运行镜像文件
Dockerfile指令
- FROM:指定父镜像,基于哪个镜像 image 构建 指定基础镜像,必须为第一个
- MAINTAINER:维护者
- RUN:容器创建的时候执行一段命令,构建镜像时执行的命令
- ADD:将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget
- COPY:功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源
- CMD:构建容器后调用,也就是在容器启动时才进行调用,.sh 执行文件
- ENV:设置环境变量
- EXPOSE:指定于外界交互的端口
- VOLUME:用于指定持久化目录
- WORKDIR:设置进入容器时的默认访问目录
示例:制作自己的centos镜像,实现进入容器中默认访问/usr目录,并且可以运行vim(docker的centos是比较轻量的,所以没有vim)
步骤:
- 制作一个Dockerfile文件
- 继承docker hub的centos镜像
- 更改自定义镜像的默认目录
- 安装vim插件
Dockerfile文件示例:
dockerfile
# 继承docker hub中的centos7镜像
FROM centos:7
# 镜像作者
MAINTAINER t1an
# 配置环境变量
ENV MY_PATH /usr
# 进入到容器中默认访问的目录
WORKDIR $MY_PATH
# 安装下载vim插件
RUN yum -y install vim
# 暴露外部访问端口
EXPOSE 80
# 启动容器成功后自动进入容器
#/bin/bash,就是为了让你用 docker run -it 启动后,能直接进入容器的命令行终端
CMD /bin/bash
RUN和CMD的区别:
虽然两者都是执行命令的,但是完全不是一个用途,
- RUN:构建镜像时执行的命令(造房子时干活),可以写多个,不可覆盖。主要用于安装依赖、配置环境
- CMD:启动容器时执行的命令(住房子时运行),只能一个(最后生效),可被
docker run覆盖。主要用于指定容器启动命令
dockerfile
# 基础镜像(自带 Node.js)
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json
COPY package.json ./
# ==========================================
# 👇 👇 这是 RUN:构建镜像时执行(安装依赖)
# ==========================================
RUN npm install
# 复制项目代码
COPY . .
# 暴露端口
EXPOSE 3000
# ==========================================
# 👇 👇 这是 CMD:启动容器时执行(启动项目)
# ==========================================
CMD ["node", "app.js"]
当时也不是必须使用CMD来配置命令,如果不写CMD的话就像:
dockerfile
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
# 这里没有 CMD!
启动的时候就需要这样写:
bash
docker run my-app node app.js
打包Dockerfile文件
在上面步骤中,我们制作了一个Dockerfile文件,然后需要打包成镜像文件,打包命令如下:
bash
docker build -f Dockerfile -t my_centos:1 .
-f:--file,指定Dockerfile文件路径-t:--tag,指定镜像名称和标签.:当前目录 Docker 会把这个目录的文件传给构建引擎,用于 COPY/ADD 等指令
docker compose 容器编排技术
编写docker-compose.yml文件
yaml
version: "3.8"
services: # 服务
tomcat8080: # 服务名称
container_name: demo8080 # 指定容器名称
image: tomcat:8 # 依赖镜像文件名称 tomcat:8
ports:
- 8080:8080
volumes: # 数据卷 容器外部与容器内部实现共享 -v指令
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks: # 服务网络连接的桥,有了就可以两个容器直接进行网络连接
- demo_web
tomcat8081:
image: tomcat:8
ports:
- 8081:8080
volumes:
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks:
- demo_web
networks: # 定义服务网络连接的桥
demo_web:
这里以springboot项目为例,springboot需要依赖mysql容器,所以需要等到mysql容器启动后,才运行springboot
yaml
version: "3.0"
services:
mysql: # mysql服务
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问
ports:
- "3306:3306" # 容器端口映射到宿主机的端口
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'mydb'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '123456'
networks:
- demo_web
demo-web: # 自己单独的springboot项目
hostname: demo # 给容器内部设置一个 "主机名",例如:http://demo:8080
build: ./ # 需要构建的Dockerfile文件
ports:
- "38000:8080" # 容器端口映射到宿主机的端口
depends_on: # web服务依赖mysql服务,要等mysql服务先启动
- mysql
networks:
- demo_web
networks: ## 定义服务的桥
demo_web:
运行docker-compose.yml文件
bash
docker compose up -d
-d:后台启动-f:指定docker-compose.yml文件路径和名称
查看运行状态
bash
docker compose ps
停止容器
- 停止(不删除容器)
bash
docker compose stop
- 停止并删除容器 + 网络(保留数据卷)
bash
docker compose down
- 停止并删除容器 + 网络 + 数据卷
bash
docker compose down -v