重学docker

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指令

  1. FROM:指定父镜像,基于哪个镜像 image 构建 指定基础镜像,必须为第一个
  2. MAINTAINER:维护者
  3. RUN:容器创建的时候执行一段命令,构建镜像时执行的命令
  4. ADD:将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget
  5. COPY:功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源
  6. CMD:构建容器后调用,也就是在容器启动时才进行调用,.sh 执行文件
  7. ENV:设置环境变量
  8. EXPOSE:指定于外界交互的端口
  9. VOLUME:用于指定持久化目录
  10. WORKDIR:设置进入容器时的默认访问目录

示例:制作自己的centos镜像,实现进入容器中默认访问/usr目录,并且可以运行vim(docker的centos是比较轻量的,所以没有vim)

步骤:

  1. 制作一个Dockerfile文件
  2. 继承docker hub的centos镜像
  3. 更改自定义镜像的默认目录
  4. 安装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
相关推荐
IDIOT___IDIOT1 小时前
Windows 安装 Docker Desktop
windows·docker·容器
做个文艺程序员6 小时前
第04篇:K8s 弹性伸缩实战:HPA、VPA、KEDA——Java SaaS 应对流量洪峰的秘密武器
java·容器·kubernetes·弹性伸缩·自动扩容·ai 推理伸缩
gsls20080812 小时前
JVM 堆内存参数 & Docker 容器适配,一次讲清楚
jvm·docker·容器
Lumbrologist13 小时前
【零基础部署】Docker 部署 AutoGen 多 Agent 对话框架保姆级教程
运维·docker·容器
做个文艺程序员15 小时前
第02篇:K8s 存储与配置管理:ConfigMap、Secret、PV/PVC 实战——Java SaaS 多租户配置最佳实践
java·容器·kubernetes
Plastic garden16 小时前
Docker compose ruoyi示例
运维·docker·容器
qq_4523962316 小时前
第十四篇:《Docker Swarm 生产实践:堆栈部署与配置管理》
运维·docker·容器
qq_4523962317 小时前
第十三篇:《Docker Swarm 集群基础》
运维·docker·容器
取经蜗牛18 小时前
docker环境中redis连接三种场景配置指南,物理机、wsl、docker
redis·docker·容器