Docker系列 基础系列 docker及docker-compose基础用法
本文最后更新于 2024年6月21日, 如有失效请评论区留言。

一、常用命令

1. Images 镜像命令

1.查看本机中所有镜像

docker images       列出本地所有镜像
docker images -a    列出所有镜像(包含中间映像层)
docker images -q    只显示镜像id

2.搜索镜像

docker search 镜像名        去dockerhub上查询当前镜像
docker search -s 指定值     列出收藏数不少于指定值的镜像
docker search --no-trunc   显示完整的镜像信息

3.下载

docker pull 镜像名:TAG

4.删除镜像

docker rmi 镜像名      删除
docker rmi -f         强制删除

2.Contrainer 容器命令

1.运行容器

docker run 镜像名  --------------------------  镜像名新建并启动容器   
    --name      别名为容器起一个名字   
    -d        启动守护式容器(在后台启动容器)   
    -p        映射端口号:原始端口号   指定端口号启动  

例:docker run -it –name myTomcat -p 8888:8080 tomcat docker run -d –name myTomcat -P tomcat

2.查看运行的容器

docker ps     --------------------------  列出所有正在运行的容器  
    -a    正在运行的和历史运行过的容器  
    -q    静默模式,只显示容器编号

3.停止|关闭|重启容器

docker start  容器名字或者容器id  --------------- 开启容器  
docker restart 容器名或者容器id   --------------- 重启容器  
docker stop  容器名或者容器id    ------------------ 正常停止容器运行  
docker kill  容器名或者容器id    ------------------ 立即停止容器运行

4.删除容器

docker rm -f 容器id和容器名    
docker rm -f $(docker ps -aq)  --------------------------  删除所有容器

5.查看容器内进程

docker top 容器id或者容器名 ------------------ 查看容器内的进程

6.查看查看容器内部细节

docker inspect 容器id   ------------------ 查看容器内部细节

7.查看容器的运行日志

docker logs [OPTIONS] 容器id或容器名  ------------------ 查看容器日志   
    -t    加入时间戳   
    -f    跟随最新的日志打印   
    --tail  数字 显示最后多少条

8.进入容器内部

docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令   
-i   以交互模式运行容器,通常与-t一起使用   
-t   分配一个伪终端   shell窗口  bash

9.容器和宿主机之间复制文件

docker cp 文件|目录 容器id:容器路径      -----------------  将宿主机复制到容器内部  
docker cp 容器id:容器内资源路径 宿主机目录路径  -----------------  将容器内资源拷贝到主机上

10.数据卷(volum)实现与宿主机共享目录

 docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名   

注意:

1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

11.打包镜像

docker save 镜像名 -o  名称.tar

12.载入镜像

docker load -i  名称.tar

13.容器打包成新的镜像

docker commit -m "描述信息" -a "作者信息"  (容器id或者名称)打包的镜像名称:标签

3.Network 网桥(网络)信息

1.查看网桥列表

docker network ls

2.查看网桥具体信息

docker inspect 网桥名称

3.创建一个网桥

docker network create -d bridge 网桥名称

4.删除一个网桥

docker network rm 网桥名称

4.Volume 数据卷

1.说明

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

数据卷 可以在容器之间共享和重用对

数据卷 的修改会立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

2.创建数据卷

docker volume create 卷名

3.查看数据卷

docker volume inspect 卷名

4.挂载数据卷

docker run -d -P --name web  -v my-vol:/usr/share/nginx/html  nginx
docker inspect web

image-20231210214221699

5.删除数据卷

docker volume rm 卷名

5.Docker Compose 命令

  1. 后台启动 up
docker-compose up -d
  1. 停止 stop
docker-compose stop
  1. 停止 down

会删除容器及网桥, 如果网桥还有其他容器, 则会退出该网桥

docker-compose down

二、docker-compose.yml文件详解

1.单镜像

以mysql:5.7为镜像编写的yml脚本

yml文件的缩进是有严格要求的, 注意语法错误

宿主机: 理论上为你安装docker的机器, 基本上就是你使用的服务器

docker-compose启动后会生成一个网桥, 名称为当前文件夹名_default, 容器之间想要通信, 则需要都在一个网桥之中

image-20231210175503395

version: '3' # 这指定了使用的Docker Compose文件格式的版本。
services:    # 列出了要运行的各个服务
  db:        # 这是一个服务的名称
    image: mysql:5.7    # 镜像: 以该镜像为底, 构建容器
    container_name: db  # 容器名: 可以在命令中用来代表该容器
    restart: unless-stopped # 指定了容器的重启策略: 这里为容器会在退出时自动重启,除非手动停止了容器
    ports:              # 端口映射: 定义宿主机和容器端口的对应
      - "3307:3306"     # 定义了端口映射,将宿主机的3307端口映射到容器的3306端口。
    environment:        # 定义了一些环境变量,包括MySQL的root密码、要创建的数据库名称、用户名和密码等。
      MYSQL_ROOT_PASSWORD: root   # 数据库的默认密码
      MYSQL_DATABASE: npm_db      # 创建一个npm_db数据库
      MYSQL_USER: npm_user        # 创建一个npm_user的用户名
      MYSQL_PASSWORD: npm_pwd     # npm_user的密码是npm_pwd
    command:        # 指定了容器启动时要运行的命令: 下面三列设置默认的身份验证插件、字符集和排序规则等
      - --default_authentication_plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:        # 定义数据卷: 这里是将容器内的目录挂载到宿主机上,包括MySQL的数据和配置文件目录。
      - ./mysql/data:/var/lib/mysql        # mysql数据
      - ./mysql/conf.d:/etc/mysql/conf.d   # mysql配置文件

2.多镜像依赖

事实上, docker-compose更多是用在多个镜像编排的时候. 一个完整的项目, 更多时候是由多个服务组合完成的,互相之间甚至有所依赖 . 例如WordPress他需要mysql, nginx等服务一起搭配使用.
docker-compose使用一个命令即可让多个容器或服务, 停止或启动,大大解决项目部署的时间.

这是一个包含了nginxmysql的脚本

jc21/nginx-proxy-manager: 这是一个非常好用的反向代理神器, 需要使用到mysql

同一个docker-compose文件下的服务, 启动后会自动加入同一个网桥中

image-20231210180015189

version: '3'
services:
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: npm_db
      MYSQL_USER: npm_user
      MYSQL_PASSWORD: npm_pwd
    command:
      - --default_authentication_plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d

  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
    environment:      # 这里的环境变量主要设置的为连接数据库的相关参数,而其值即为上面mysql中设置的值
      DB_MYSQL_HOST: "db"           # 值即为上面container_name(db)
      DB_MYSQL_PORT: 3306           # 值即为上面ports中的容器端口号
      DB_MYSQL_USER: "npm_user"     # 值即为上面environment(环境变量)中的MYSQL_USER
      DB_MYSQL_PASSWORD: "npm_pwd"  # 值即为上面environment(环境变量)中的MYSQL_PASSWORD
      DB_MYSQL_NAME: "npm_db"       # 值即为上面environment(环境变量)中的MYSQL_DATABASE
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:   # 指定了容器所依赖的其他服务: 值即为上面mysql的container_name(db)。这意味着在启动当前服务之前,Docker Compose会先启动db服务
      - db

3.加入指定的网桥

nginxmysql是比较常用的服务, 一般将其单独放在一个文件里, 如果这时候有新的服务需要用到他们, 只需加入他们的网桥即可.

networks: 网桥相关设置, 可以加入已存在的, 也可以自己重新设置一个

重新建一个docker-compose.yml文件

version: "3"
services:
  wordpress:
    image: wordpress:6.2.2
    container_name: wordpress
    restart: unless-stopped
    #ports:    wordpress 的 80端口可以通过nginx代理,故这里无需对外暴露端口号
    #  - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db # 连接db数据库, 可省略3306端口, 值为 mysql 的 container_name(db)
      WORDPRESS_DB_USER: xxx       # 这里的三个xxx值, 则需要单独在mysql启动后, 新建好用户才行, 也可以使用root用户
      WORDPRESS_DB_PASSWORD: xxx
      WORDPRESS_DB_NAME: xxx
    volumes:
      - ./html:/var/www/html

networks:
  default:  # 加入已存在的网桥
    external: 
      name: nginx_default  # 需要加入的网桥名 

查询nginx_default网桥

docker inspect nginx_default

发现WordPress已经加入该网桥了

image-20231210182238171

4.使用Dockerfile构建的镜像

这里对WordPress默认的上传大小做一个修改

新建文件

vi Dockerfile

输入

FROM wordpress:6.2.2
EXPOSE 80

# 从自身镜像里复制一份配置
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/conf.d/php.ini

# 配置php.ini
# 上传大小限制改为200M      为了上传一些比较大的主题包
RUN sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 200M/' /usr/local/etc/php/conf.d/php.ini

将目录3.加入指定的网桥中的yml文件的image删掉, 或者注释掉, 加一个build

build: 值为Dockerfile的存放路径, 建议和docker-compose.yml放在同一个目录下

version: "3"
services:
  wordpress:
    # image: wordpress:6.2.2
    build: ./
    container_name: wordpress
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: xxx
      WORDPRESS_DB_PASSWORD: xxx
      WORDPRESS_DB_NAME: xxx
    volumes:
      - ./html:/var/www/html

networks:
  default:
    external: 
      name: nginx_default

三、参考

docker-compose与Dockerfile的区别

原创声明
本文由 Twist 于2023年12月10日 发表在 柯基屁屁
如未特殊声明,本站所有文章均为原创;你可以在保留作者及原文地址的情况下转
转载请注明:Docker系列 基础系列 docker及docker-compose基础用法 | 柯基屁屁
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇