超完整Docker学习记录,Docker常用命令详解

发布于:2025-02-10 ⋅ 阅读:(118) ⋅ 点赞:(0)

前言

关于国内拉取不到docker镜像的问题,可以利用Github Action将需要的镜像转存到阿里云私有仓库,然后再通过阿里云私有仓库去拉取就可以了。

参考项目地址:使用Github Action将国外的Docker镜像转存到阿里云私有仓库

一、Docker简介

Docker 是一个开源的应用容器引擎工具,使用Docker可以在同一个操作系统下,利用同一套操作系统资源,创建相互隔离的运行时环境,即容器,容器完全使用沙箱机制,相互之间不会有任何接口。

Docker的主要作用是将应用程序及其运行环境和依赖,打包成一个可移植包,即镜像;方便应用程序的部署和维护。

二、名词解释:

 Docker引擎:Docker引擎是Docker的核心,负责镜像创建,管理容器运行,停止等工作。

镜像:将应用程序,及其运行环境和依赖整合到一起打成的包,可以理解为类似操作系统的镜像(iso文件)

容器:容器是通过镜像来启动和运行的,容器是镜像的运行实例,Docker容器是一个独立运行的执行单元,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序;各个容器之间是是相互隔离的,互不影响。

仓库(Docker Hub):存放镜像的地方,类似于代码仓库;Docker Hub是一个官方的,用于存储和共享Docker镜像的公共仓库。开发者可以在Docker Hub上找到各种各样的官方和社区创建的镜像,也可以将自己的镜像上传到这个平台。

容器编排(Docker Compose、K8s): Docker Compose是一个工具,允许定义和运行多个Docker容器的配置。通过一个简单的YAML文件,可以定义应用程序的各个组件、服务和它们之间的关系。

三、Docker安装

官方文档:

Install Docker Desktop on Linux

打不开链接请使用魔法 !

笔者使用的debian操作系统,直接使用官方提供的脚本安装:

curl -fsSL https://get.docker.com -o get-docker.sh

四、Dockerfile的使用 

在构建镜像时,可以创建一个Dockerfile文件,在文件中定义构建镜像的指令(如基础镜像、拷贝文件、暴露端口等)。

常用指令:

1.FROM:指定构建镜像时需要使用的基础镜像,可以指定基础镜像的版本,格式:镜像:tag

2.COPY:拷贝文件或文件夹到指定位置

3.ADD:拷贝文件或文件夹到指定位置,若拷贝的文件是压缩文件(如 .tar, .tar.gz, .zip 等)

              将会自动解压;若是从URL下载文件,ADD 还支持从URL来源复制文件,这意味

              着可以直接从互联网上下载文件并将其添加到镜像中

4.RUN:构建镜像时需要运行的shell命令

5.EXPOSE:构建的镜像在运行时对外暴露的端口号,在运行容器时,指定-p参数中的容

                      器端口可以覆盖此参数(-p 宿主机端口:容器端口)

6.WORKDIR:构建的镜像在运行时,终端登录进来默认的工作目录

7.CMD:构建的镜像,在容器启动时要运行的命令,参数为数组形式(CMD ["命令","参数1","参数2",...])

8.MAINTAINER:指定镜像创建者信息

9.ENV:设置环境变量

10.USER:构建的镜像在运行时,设置容器进程的一些用户

eq:

#基于nginx最新版本为基础镜像,必须放在第一句
FROM nginx:latest

MAINTAINER "author by Kevin"

#在容器中创建一个html目录
RUN mkdir /html

#设置登入容器后,shell默认工作目录为html
WORKDIR /html

#复制当前目录下的所有内容到容器当前工作目录(html)
COPY . .

#复制当前目录(Dockerfile所在目录)下的index.html文件到html目录下
COPY ./index.html /html

#复制当前目录下hls目录下的所有文件到html目录下的hls目录(若没有hls目录将自动创建)
COPY ./hls /html/hls

#删除nginx的默认配置文件default.conf
RUN rm /etc/nginx/conf.d/default.conf

#复制当前目录下的default.conf文件到路径/etc/nginx/conf.d下
ADD default.conf /etc/nginx/conf.d

#对外暴露容器端口为8080
EXPOSE 8080

#赋予文件install.sh执行权限
RUN  chmod -v +x /install.sh

#容器启动时,运行bash程序并执行install.sh脚本
CMD ["/bin/bash","install.sh"]

在执行复制操作时,若希望Dockerfile忽略某些目录或文件,可在当前目录下创建一个 .dockerignore文件,如:

#忽略node_modules目录
node_modules

#忽略package-lock.json文件
package-lock.json

五、Docker常用命令

1.Docker服务启停

# 启动Docker服务
systemctl start docker
 
# 停止Docker服务
systemctl stop docker
 
# 重启服务
systemctl restart docker
 
# 设置开机自启
systemctl enable docker

2.Docker查看命令

#查看docker版本
docker --version
#或
docker -v

#查看docker运行状态
systemctl status docker

#查看docker概要信息
docker info

#查看容器、镜像、网络、卷等详细信息,返回JSON格式的结果
docker inspect 容器id/容器名称/镜像id/镜像名/卷名

#查看容器日志
docker logs <容器id或容器名>

#查看正在运行的容器
docker ps

#查看最近创建的容器
docker -ps  -l

#查看正在运行的容器,只显示id
docker ps -q

#查看所有运行的容器,包含历史运行过的容器
docker ps -a

#注:容器id不用输完整,在保证不会重复的情况下,输前几位就行

#查看容器端口映射情况
docker port 容器id

#查看运行中的容器资源占用情况
docker stats 容器id(可以为多个id,空格分割,或者不传查看所有容器)

#查看容器内部运行的进程列表
docker top 容器id

#查看本地镜像列表
docker images

#查看本地镜像列表,包含历史镜像
docker images -a

#查看本地镜像列表,只显示id
docker images -q

#在镜像仓库搜索镜像
docker search 镜像名称

#查看容器/镜像/数据卷所占用的空间大小,数量等
docker system df

3.镜像操作 

3.1.镜像创建 

#构建镜像,"."表示使用当前目录下的Dockerfile构建
docker build -t 镜像名:tag .
#eq: docker build -t test-image:v1.0

#从镜像仓库拉取镜像到本地环境,若不指定版本将拉取最新版本
docker pull 镜像名:版本
#eq:docker pull nginx

#镜像仓库登录
docker login --username=<your-account-name> <your-repo-address>

3.2.镜像删除 

#删除镜像,可删除多个镜像,镜像id用空格分割
docker rmi 镜像id:tag

#强制删除镜像
docker rmi 镜像id -f

#删除所有镜像,$()的作用可以理解为执行一个子查询
docker rmi -f $(docker images -aq)

3.3.镜像导入导出 

#保存hls-test镜像的v1版本到home目录下,并命名为hls.tar归档文件
docker save hls-test:v1 > /home/hls.tar

#加载hls.tar归档文件镜像
docker load < hls.tar

4.容器操作

4.1.容器运行

语法:docker run [options] image:tag [command]

参数:

         --name=“容器新名字”

        -d:后台运行容器

        -i:以交互模式运行容器  interactive

        -t:为容器重新分配一个为输入终端

        -P:随机终端口映射,大写P

        -p:指定终端口映射,小写p,格式:-p <宿主机端口>:<容器端口>

        -v:容器目录挂载或卷映射,格式:<宿主机目录路径>:<容器目录路径>或

               <卷名>:<容器目录路径>

eq:

#用hls-test:v1镜像,以后台模式运行一个容器,并将容器的80端口映射到宿主机的8080端口
#并指定容器名为test,将宿主机的home/html目录(自动创建)挂载到容器html/hls目录
docker run --name test -p 8080:80 -v /home/html:/html/hls -d hls-test:v1

#使用卷映射方式替代目录挂载,卷名nginx_html(宿主机自动创建,默认在/var/lib/docker/volumes目录下)
docker run --name test -p 8080:80 -v nginx_html:/html/hls -d hls-test:v1

#交互式运行容器,可以进入到容器内部,执行一些操作
#在容器中输入exit可退出容器,退出同时容器也会停止运行
#按快捷键ctrl+p+q可退出容器,退出后容器不会停止运行
docker run -p 8080:80 -it hls-test:v1 /bin/bash

#退出容器后可再次进入容器(前提是容器没有停止)
docker exec -it <容器id> bash
docker exec -it <容器id> /bin/bash
#或
docker attach <容器id>

#注:exec命令是在容器中打开新的终端,不会启动新进程,用exit退出后,容器不会停止
#attach命令是直接进入容器的终端,用exit退出后,会导致容器停止

4.2.容器启停

#停止正在运行的容器
docker stop <容器id或容器名>

#停止所有正在运行的容器
docker stop $(docker ps -q)

#重启容器
docker restart <容器id或容器名>

#启动已停止的容器
docker start <容器id或容器名>

#强制停止容器
docker kill <容器id或容器名>

#强制停止所有容器
docker kill $(docker ps -a -q)

#注:容器id不用输完整,在保证不会重复的情况下,输前几位就行

4.3.容器删除

#删除已停止的容器
docker rm <容器id或容器名>

#正在运行的容器需要强制删除
docker rm -f <容器id或容器名>

#清理所有没有在运行状态的容器
docker continer prune

#删除正在运行的所有容器
docker rm -f $(docker ps -a -q)
#或
docker ps -q -a | xargs docker rm -f

4.4.文件拷贝

#拷贝容器中的index.html文件到宿主机的home目录
docker cp <容器id>:容器内index.html的路径 /home

4.5.容器导入导出

#导出正在运行的容器为一个tar归档文件
docker export <容器id> -o 文件名.tar

#将hls-test.tar归档文件中的内容导入为一个新的镜像,-m参数表示注释
#短横线“-”后的hls-test:v1分别表示镜像名称和版本(tag)
cat hls-test.tar | docker import -m 导入测试 - hls-test:v1

六、Docker网络

1.基本网络的使用

每台机器在安装了docker后,都会创建一个虚拟的docker0网卡,用于容器之间的通信

有了这个网卡,后续每创建一个容器都会分配一个ip地址,docker0网卡的ip(172.17.0.1)将作为容器的网关地址;使用以下命令可查看容器ip

docker inspect <容器id或容器名称>

进入到另一个运行的容器中,可以通过ip地址(172.17.0.3)加端口(容器端口)访问这个容器的内容

eq:

2.自定义网络 

docker支持创建自定义网络

#创建一个名为docker_net的网络,网段参数可以省略
#--driver bridge 参数指定为桥接模式
docker network create --driver bridge <网段> docker_net

#查看docker网络列表
docker network ls

#删除创建的自定义网络
docker network rm <网卡id或者名称>

创建自定义网络后,在启动容器时可以指定容器使用这个网络,并且指定容器的名称,那么这样启动的容器可以通过以下方式访问

http://容器名称:端口

使用这种方式访问相当于通过固定域名访问容器,即使容器ip变了,只要容器名没变,依然能够正常访问。

分别启动两个容器,指定容器名称为app1和app2,并且都加入docker_net网络,然后进入app1容器,通过curl访问app2的内容

eq:

通过以下命令可查看docker_net网络加入了哪些容器

#查看docker网络详情
docker network inspect <网络名称>

七、容器编排

 Docker-Compose是官方的开源项目,其作用是定义多个Docker容器应用,方便同时管理这些容器的运行、启动顺序、重启、停止等操作。

Docker是轻量化的应用程序,其官方提倡每个容器只运行一个进程(服务或应用)。但通常我们的项目需要用到如nginx、MySQL、Redis、Nacos等多个环境,那么部署项目时需要单独创建并运行多个容器,操作起来还是比较繁琐。

Docker-Compose允许用户通过一个单独的docker-compose.yaml配置文件,来定义一组相关的容器为一个项目。只需要执行一次命令便可创建这一组镜像,或启动这一组容器。

Docker-Compose在安装Docker的时候已经默认安装了,可通过以下命令查看其版本

docker compose version

1.配置项

顶级元素:

name - 应用名字(随意)

version - 指定使用哪个版本的docker-compose

services - 指定如何创建一个镜像,可以配置多个services

networks - 自定义网络,如果容器使用了自定义网络,网络名称必须在此配置项下定义

volumes - 定义数据卷,如果容器挂载了数据卷,挂载的数据卷必须在此配置项下定义

configs - 容器配置项

secrets - 秘钥

services配置项:

image - 指定使用哪一个镜像作为基础镜像(必选项)

command - 容器启动时执行的命令,会覆盖默认镜像中的CMD命令

environment - 容器的环境变量,等价于docker run命令行中的 --env参数
volumes - 设置容器的数据卷挂载
networks - 指定容器使用哪个网络
ports - 容器端口映射
expose - 指定容器暴露的端口
build - 指定构建镜像的基准目录
env_file - 指定环境变量文件,如:.env

depends_on - 启动当前容器前需要依赖的配置项,即容器启动顺序设置

容器端口映射支持两种配置方式,分别为短语法(数组形式):

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "8000-9000:80"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"  
  - "::1:6000:6000"   
  - "[::1]:6001:6001" 
  - "6060:6060/udp"    

 和长语法(更详细的配置):

ports:
  - name: web
    target: 80
    host_ip: 127.0.0.1
    published: "8080"
    protocol: tcp
    app_protocol: http
    mode: host

  - name: web-secured
    target: 443
    host_ip: 127.0.0.1
    published: "8083-9000"
    protocol: tcp
    app_protocol: https
    mode: host

 这里只列举部分常用配置项,更多其他配置项可以参考官方文档

Compose file reference | Docker Docs

 打不开链接请使用魔法!

eq:定义一个项目名为myApp,分别创建两个容器mysql和hls-test2;mysql容器使用官方的mysql镜像,hls-test2容器启动时创建一个镜像hls-test:v2,并用hls-test:v2镜像来启动,两个容器都使用自定义网络docker-net

#docker-compose.yaml

name: myApp
services:
  mysql: #服务名称,可随便定义
    container_name: mysql #容器名,可随便指定
    image: mysql #指定使用哪个镜像启动容器
    ports: #端口映射支持长语法和短语法两种方式
      - "3306:3306"
    environment: #设置环境变量
      - MYSQL_ROOT_PASSWORD=123456
    volumes: #挂载卷data-dir
      - data-dir:/var/lib/mysql
      - /app/data-conf:/etc/mysql/conf.d #将宿主机的data-conf目录挂载到容器/etc/mysql/conf.d目录
    restart: always #开机自启mysql服务
    networks:
      - docker-net #使用自定义网络
  hls-test: #服务名称
    container_name: hls-test2
    #这里的image值需在下面tags配置中存在,报警告docker hub不存在指定的镜像不用理会,创建之后本地就有了
    #若不指定此项,构建的镜像会使用默认方式命名,就会多出来一个hash相同名称不同的重复镜像
    #默认镜像名称格式为name的值与服务名称以短横线拼接而成(myapp-hls-test)
    image: hls-test:v2 
    ports:
      - "8080:80"
    networks:
      - docker-net
    build: #指定此项配置表示构建一个新镜像
      context: . #构建镜像的上下文操作目录
      dockerfile: Dockerfile #指定Dockerfile文件,默认为Dockerfile
      #指定创建的镜像的版本(tag)
      tags: #如不指定此项,且image选项也没指定,则会使用默认方式命名镜像
          #默认方式命名镜像格式为:顶级元素name的值与服务名称以短横线拼接而成,版本为latest
          #如:myapp-hls-test:latest
        - "hls-test:v2" 
    depends_on: 
      - mysql #启动容器前先启动mysql容器
volumes:
  data-dir: #定义容器用到的卷  

networks:
  docker-net: #定义docker-net网络
    driver: bridge

执行上线命令

docker compose up -d

可以看到两个容器已经创建并启动了 :

 镜像也创建了:

2.命令

#应用上线(容器创建并启动),-d参数指定所有容器后台运行
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose -f compose.yaml up -d

#应用下线,默认会自动移除创建的容器和网络,volume(卷)和image(镜像)不会移除
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose -f compose.yaml down

#应用下线,并移除创建的mysql镜像和所有卷
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose down --rmi mysql -v

#应用下线,并移除创建的所有镜像和所有卷
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose down --rmi all -v

 

#批量启动已经停止的容器
docker compose start container_name1 container_name2

#批量停止已启动的容器
docker compose stop container_name1 container_name2

#批量重启容器
docker compose restart container_name1 container_name2

#查看容器日志
docker compose logs <容器名/容器ID>

#查看被compose启动的容器进程
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose -f compose.yaml top

#查看被compose创建或拉取的镜像列表
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose -f compose.yaml images

#查看被compose运行的容器列表
#-f参数指定docker-compose的yaml配置文件,可不指定,默认为docker-compose.yaml
docker compose -f compose.yaml ps

更多docker-compose命令可参考官方文档,打不开链接请使用魔法!

Docker Compose | Subcommands Docs 


网站公告

今日签到

点亮在社区的每一天
去签到