docker快速入门

Docker快速入门

1. 使用镜像

  1. 拉取镜像

    1
    docker pull image

    镜像默认保存在 /var/lib/docker/overlay2

  2. 运行镜像

    以上面的 ubuntu:18.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

    1
    docker run -it --rm ubuntu:18.04 bash

    通过 exit 退出这个容器

  3. 列出镜像

    1
    docker image ls 
  4. 删除镜像

    1
    docker image rm [id/name]

    可以通过指定镜像名或者镜像id进行删除操作

  5. 使用Dockerfile定制镜像

    1. 创建Dockerfile文件

    2. 写入

      1
      2
      FROM nginx
      RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

      From 指定基础镜像

      RUN 执行shell命令 支持 && 串联命令 \ 单条命令换

    3. 构建镜像

      在Dockerfile目录执行

      1
      docker build -t [镜像名] [上下文目录]

      上下文目录不是用来指定dockerfile文件所在位置,而是告诉docker创建该镜像要用到哪个目录下的资源

  6. RUN指令细节

    一些初学者常犯的错误是把 Dockerfile 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:

    1
    2
    RUN cd /app
    RUN echo "hello" > world.txt

    如果将这个 Dockerfile 进行构建镜像运行后,会发现找不到 /app/world.txt 文件,或者其内容不是 hello,之前说过每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN cd /app 的执行仅仅是当前进程的工作目录变更,一个内存上的变化而已,其结果不会造成任何文件变更。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。

2. 操作容器

  1. 启动

    1. 新建容器并启动

      1
      docker run 

      例如:

      • 打印后终止容器

        1
        docker run ubuntu:18.04 /bin/echo 'hello world'
      • 启动终端,允许交互

        1
        docker run -it ubuntu:18.04  /bin/bash

        -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开

    2. 启动已经终止的容器

      1
      docker container start [容器名/容器id]

      该方式启动的容器默认就是在后台运行

  2. 守护态运行

    添加-d参数可以让容器在后台运行

    1
    2
    docker run  -d ubuntu:18.04 /bin/sh -c "while true; do echo
    hello world; sleep 1; done"

    要获取容器的输出信息,可以通过 docker container logs 命令。

  3. 终止

    可以使用 docker container stop 来终止一个运行中的容器。并且容器指定的应用终止时,容器也自动终止。

  4. 进入容器

    在使用 -d 参数时,容器启动后会进入后台。

    某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令。因为attach进入容器后,如果exit会导致进程终止。

    1
    docker exec -it [容器] bash
  5. 导出和导入

    • 导出容器

      1
      docker export [容器] > ubuntu.tar
    • 导入容器

      从容器快照中再导入为镜像

      1
      cat ubuntu.tar | docker import - test/ubuntu:v1.0
  6. 删除

    删除指定容器

    1
    docker container rm [容器]

    删除运行中的容器

    1
    docker container rm -f [容器]

    清理所有终止态的容器

    1
    docker container prune

3. 数据管理

  1. docker数据卷

好处:

  • 容器间可以共享数据卷
  • 对数据卷的修改会立马生效
  • 数据卷的修改不会影响镜像
  • 容器删除后,数据卷依然存在
  1. 创建数据卷

    1
    docker volume create [卷名]

    查看数据卷信息

    1
    docker volume inspect [卷名]
  2. 将数据卷挂载到容器中

    下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /usr/share/nginx/html 目录。

    1
    2
    3
    4
    5
    $ docker run -d -P \
    --name web \
    # -v my-vol:/usr/share/nginx/html \
    --mount source=my-vol,target=/usr/share/nginx/html \
    nginx:alpine
  3. 删除卷

    1
    docker volume rm my-vol

    清除无主数据卷

    1
    docker volume prune
  4. 将主机目录作为数据卷

    使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去

    1
    2
    3
    4
    5
    $ docker run -d -P \
    --name web \
    # -v /src/webapp:/usr/share/nginx/html \
    --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
    nginx:alpine

4. 使用网络

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。

当使用 -P 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。

1
2
3
4
5
$ docker run -d -P nginx:alpine

$ docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fae320d08268 nginx:alpine "/docker-entrypoint.…" 24 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp bold_mcnulty

同样的,可以通过 docker logs 命令来查看访问记录。

1
docker logs [容器]

使用 hostPort:containerPort 格式本地的 80 端口映射到容器的 80 端口,可以执行

1
docker run -d -p 80:80 nginx:alpine

左侧为主机端口,右侧为容器端口

动过port查看容器的端口映射情况

1
docker port [容器]

docker快速入门
http://xyxblog.com/2024/10/14/docker快速入门/
作者
xyx
发布于
2024年10月14日
许可协议