Docker入门手册

Docker入门手册

说明

本文环境为CentOS 7虚拟机, 并通过宿主机访问运行项目, 访问容器时的ip地址请根据自身环境进行修改

本文多数内容为官方文档的节选翻译与修改

介绍

懒得看就跳过吧

  • 什么是Docker

    Docker是一个开源的容器引擎, 可以允许任意语言实现的项目或模块从框架中拆出, 打包成镜像(image)后在容器(Container)内运行

  • 为什么用Docker

    Docker可以通过统一的方式进行部署

    容器的性能开销极低, 且相互之间没有接口

  • 什么是容器(container)

    简单来说, 容器就是在机器上运行的一个进程(process), 与其他进程都不相干

  • 什么是镜像(image)

    当运行一个容器时, 它使用的是一套独立的文件系统, 这套文件系统是由镜像提供的

    因此, 镜像内包含了所有运行应用所需要的 - 所有依赖, 配置, 脚本, 二进制文件等

    镜像中也含有其他的容器配置, 如环境变量, 默认运行指令, 与其他元数据

下载安装

卸载旧版本

旧版本的Docker名为dockerdocker-engine, 现在名为docker-ce

如果有安装过旧版本, 卸载它们以及相关依赖

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

如果yum提示没有安装过这些包也没有问题

/var/lib/docker/中的镜像, 容器, 持久化数据, 和网络的内容会被保留

安装

Docker有多种安装方法, 这里介绍其中一种

通过存储库安装

在一台新机器上首次安装Docker前, 需要先配置Docker存储库(repository). 然后你就可以通过存储库来安装Docker

配置存储库

安装yum-utils包(它提供了yum-config-manager功能)并配置stable的存储库

1
2
3
4
5
sudo yum install -y yum-utils

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

安装Docker引擎

  1. 安装最新版本Docker引擎与containerd, 也可以通过其他方式安装希望的指定版本, 这里只介绍最新版的安装方法

    1
    sudo yum install docker-ce docker-ce-cli containerd.io

    如果提示需要接受GPG key, 确认其指纹码为060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35, 如果正确, 就接受

    这条指令将安装Docker, 但是不会启动它. 它也会创建一个docker用户组, 但是不会添加任何用户

  2. 启动Docker

    1
    sudo systemctl start docker
  3. 通过运行hello-world镜像来验证Docker安装

    1
    sudo docker run hello-world

    第一次运行可能需要一段时间来进行镜像下载

    若显示内容类似下文, 则安装成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash

    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/

    For more examples and ideas, visit:
    https://docs.docker.com/get-started/

更新Docker引擎

依照上文重新安装最新版本

使用入门

开始教程 § Getting Started

通过指令开启教程

1
docker run -d -p 80:80 docker/getting-started

访问docker所在机器ip地址可以打开教程页面, 本地为127.0.0.1

docker-1

运行一个程序 § Our Application

在教程接下来的部分, 我们将使用一个简单的在Node.js上运行的todo list manager项目.

todo-list-sample

获取应用

在运行应用之前, 我们需要先获取应用的源代码. 一般真实的项目都会通过存储库拉取源代码, 但教程中直接使用一个已经创建好的zip文件

  1. 通过点击界面中的Download the ZIP下载, 解压下载到的文件, 放到docker所在机器中

  2. 打开文件夹, 你应该看到package.json文件与两个分别名为srcspec的子文件夹

    todo-list-sample

构建镜像

我们需要一个DockerFile文件来构建镜像

  1. package.json的同级目录下新建一个名为DockerFile的文件, 不带后缀名

    添加如下内容

    1
    2
    3
    4
    5
    6
    FROM node:12-alpine
    RUN apk add --no-cache python g++ make
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "src/index.js"]

    FROM指定运行平台

    RUN容器内指运行指令

    WORKDIR设置其他指令的执行路径

    COPYdocker所在本地文件拷贝到容器中

    CMD指定容器运行后的默认运行指令

  2. 打开一个一个终端, 进入app文件夹下, 执行如下指令

    1
    docker build -t getting-started .

    build指令将使用DockerFile进行镜像的构建

    -t 让用户指定镜像名称, 此处指定为getting-started

    .指定源代码文件所在处为当前目录

开启一个应用容器

现在我们有了镜像, 可以运行程序了

  1. 通过指令使用容器来运行程序

    1
    docker run -dp 3000:3000 getting-started

    -d指以detached模式运行, 后台运行

    -p指定端口映射, 3000:3000冒号左侧为外部端口, 右侧为容器端口

  2. 容器启动完成后, 访问3000端口, 应该可以看到应用

    docker-4

  3. 可以尝试输入并添加Item

至此, 已经成功地构建了一个镜像并在容器上运行

常用指令

镜像

构建镜像: docker build -t imageName /sourcePath

查看所有镜像: docker image listdocker images

REPOSITORY TAG IMAGE ID CREATED SIZE
getting-started latest 7119d8e65d53 17 hours ago 383MB
node 12-alpine 8f64b60a9fa9 13 days ago 88.9MB
docker/getting-started latest 083d7564d904 2 months ago 28MB
hello-world latest d1165f221234 5 months ago 13.3kB

运行镜像: docker run -dp 80:80 imageName

删除镜像: docker image rm imageNamedocker rmi imagename

容器

查看运行中的容器: docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eccf13ef7b5a getting-started “docker-entrypoint.s…” 20 minutes ago Up 20 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp naughty_solomon
4429c4bf8840 docker/getting-started “/docker-entrypoint.…” 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp laughing_visvesvaraya

查看所有容器: docker ps -a

停止容器: docker stop containerId

  • 需要提供containerId的地方都可以只写前几位
  • 例如docker stop ecc

删除容器: docker rm containerId

  • 只能删除已经停止的容器
  • 或者通过添加-f来强制删除运行中容器

删除所有已经停止的容器: docker container prune

日志

容器日志

Docker的容器产生的日志

查看日志:

  • 一般情况下, 执行docker logs containerId
    指令选项

    • -f | --follow: 实时跟踪模式
    • -n | --tail string: 显示最末尾的几行, 默认为all
    • -t | --timpstamps: 显示时间戳
    • --since string: 显示某时间之后的日志
      • '2008-08-08': 2008-08-08至今的日志
      • '2008-08-08T08:08:08': 2008-08-08 08:08:08至今的日志
      • 60m: 60分钟内的日志
    • --until string: 显示某时间之前的日志
      • --since效果相反, 格式相同
    • --details: 显示更多信息
  • 也可以通过进入容器内查看日志, 执行docker exec -it xx bashdocker exec -it xx sh, 进入容器内后执行tail -f

  • 针对Docker Swarm模式, 执行docker service logs containerId

    Docker Swarm是Docker集群平台

引擎日志

Docker引擎自身产生的日志

查看日志: journalctl -u docker

参考