零基础学习Docker

Docker官方文档

基础语法

docker pull: 从DockerHub上拉取镜像

$ docker pull ngnix
Using default tag: latest
latest: Pulling from library/nginx
9e3ea8720c6d: Pull complete 
bf36b6466679: Pull complete 
15a97cf85bb8: Pull complete 
9c2d6be5a61d: Pull complete 
6b7e4a5c7c7a: Pull complete 
8db4caa19df8: Pull complete 
Digest: sha256:721cbabd4f976638504427458ad619fdf32967176835b4779e6bef243b2e8972
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

该指令可以配合标签Tag来获取想要的版本(默认为latest)

$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
===============>省略<==============
$ docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
===============>省略<==============

docker image <command>: 可用于管理系统上的

$ docker image
Usage:    docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.

常用的有: lshistorypullrm

$ docker image ls
列出系统中的docker镜像
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
nginx                      latest              448a08f1d2f9        6 hours ago         142MB
==================>.....<=======================
$ docker image rm REPOSITOPY:TAG 或 IMAGE ID
例如删除ubuntu:20.04镜像的部分回显
Untagged: ubuntu:20.04
Untagged: ubuntu@sha256:db8bf6f4fb351aa7a26e27ba2686cf35a6a409f65603e59d4c203e58387dc6b3
==================>.....<=======================
$ docker image history REPOSITOPY:TAG 或 IMAGE ID
获取该镜像的历史信息
docker imagesdocker image ls的作用相同,只不过自 Docker 17.06 版本开始,更推荐使用后者。

运行一个容器

大体上,运行容器的命令格式是docker run [option] IMAGE_NAME [COMMAND] [ARGUMENTS...]

常用的选项(option):

-d:以“分离”模式启动。这意味着容器将在后台运行。

-it: “i”表示交互运行,“t”告诉 Docker 在容器内运行一个 shell。如果想要与容器进行交互,可以选择这个。

-p:端口映射。将主机操作系统上的端口绑定到容器中公开的端口。-p 主机端口:容器端口

--rm:一旦Docker完成运行就删除容器。

--name:给容器取个名字。

-v:(一般配合Dockerfile),将主机中的某个目录挂在到文件的某个目录。

来一个简单的操作

-- 从Docker Hub上拉取一个镜像
$ docker pull testcontainers/helloworld
=====>拉取过程<=====
$ docker run -d -p 8080:8080 -p 8081:8081 --name Thisisname testcontainers/helloworld
===>在后台运行
$docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
7c2b1146d35a        testcontainers/helloworld   "/helloworld"            4 minutes ago       Up 4 minutes        0.0.0.0:8080->8080/tcp   Thisisname

在浏览器访问127.0.0.1:8080即可访问。

关闭容器 docker stop CONTAINER ID.

Dockerfiles

Dockerfiles 是一个格式化的文本文件,它本质上是作为容器应该做什么的说明手册,并最终组装 Docker 镜像。

FROM:设置基础映像(操作系统)。必须以此开头,比如FROM ubuntu

RUN:该命令将在新层内的容器中执行命令,比如RUN apt-get update

COPY:将文件从本地系统复制到容器中的工作目录。比如COPY /code /www

CMD:指定启动容器的命令(或脚本)。比如CMD /bin/sh -c script.sh

EXPOSE:暴露端口,用于声明容器运行时需要监听的网络端口。配合-p映射出来。比如EXPOSE 80 81

写一个简单的Dockerfile并build

# Get base Docker
FROM ubuntu:22.04

#Update the APT repo 
RUN apt-get update -y

# Install Apache2
RUN apt-get install apache2

# tell the container abot port
EXPOSE 5200

# run the apache2 server
CMD ["apache2ctl", "-D", "FOREGROUND"]

docker build -t webserver .会通过Dockerfile来构建一个容器镜像。

查看一下:

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
webserver    latest    be1b2fa6a23b   About an hour ago   230MB

运行(run)容器

$ docker -p 5200:80 webserver

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                             NAMES
1bb77e37beb9   testweb   "apache2ctl -D FOREG…"   4 minutes ago   Up 4 minutes   5200/tcp, 0.0.0.0:5200->80/tcp, :::5200->80/tcp   lucid_turing

这里有一个让我很困惑的点,记录一下:

为什么映射的端口为5200:80,默认情况下是这个。因为Dockerfile指定的EXPOSE端口为5200,而apache2的默认端口是80,因此只有5200:80这种组合,分号前是主机端口,分号后是容器端口

如果Dockerfile中的是EXPOSE 5200 5201,运行的时候可以是docker run -p 5200:80 -p 5201:80 webserver

优化Dockerfile

  1. 只安装必要的包。
  2. 删除缓存文件。
  3. 尽量选择最小的基本操作系统,即FROM xxx.
  4. 最小化层数。

    每条指令(FROM、RUN等)都在其自己的层中运行。图层的增加会导致时间的增长。因此,我们再写Dockerfile文件时,要用尽量少的层数。如下:

    多层数

    FROM ubuntu:latest
    RUN apt-get update -y
    RUN apt-get upgrade -y
    RUN apt-get install apache2 -y
    RUN apt-get install net-tools -y

    运行的结果

    --omitted for brevity--
    Step 2/5 : RUN apt-get update -y
     ---> Using cache
     ---> 446962612d20
    Step 3/5 : RUN apt-get upgrade -y
     ---> Running in 8bed81c695f4
    --omitted for brevity--

    优化

    FROM ubuntu:latest
    RUN apt-get update -y && apt-get upgrade -y && apt-get install apache2 -y && apt-get install net-tools

    运行结果:( 只剩下了两层 )

    Sending build context to Docker daemon   4.78MB
    Step 1/2 : FROM ubuntu
     ---> 2dc39ba059dc
    Step 2/2 : RUN apt-get update -y && apt-get upgrade -y && apt-get install apache2 -y && apt-get install net-tools
     ---> Running in a4d4943bcf04
    --omitted for brevity--

    简化层数,在大文件Dockerfile中会有显著的速度提升。

Docker Compose

https://docs.docker.com/compose/reference/

【挖个坑】

Last modification:May 7, 2023
请我喝瓶冰阔落吧