Docker入门手册
Docker入门手册
说明
本文环境为CentOS 7虚拟机, 并通过宿主机访问运行项目, 访问容器时的ip地址请根据自身环境进行修改
本文多数内容为官方文档的节选翻译与修改
介绍
懒得看就跳过吧
什么是
DockerDocker是一个开源的容器引擎, 可以允许任意语言实现的项目或模块从框架中拆出, 打包成镜像(image)后在容器(Container)内运行为什么用
DockerDocker可以通过统一的方式进行部署容器的性能开销极低, 且相互之间没有接口什么是
容器(container)简单来说,
容器就是在机器上运行的一个进程(process), 与其他进程都不相干什么是
镜像(image)当运行一个
容器时, 它使用的是一套独立的文件系统, 这套文件系统是由镜像提供的因此, 镜像内包含了所有运行应用所需要的 - 所有依赖, 配置, 脚本, 二进制文件等
镜像中也含有其他的容器配置, 如环境变量, 默认运行指令, 与其他元数据
下载安装
卸载旧版本
旧版本的Docker名为docker或docker-engine, 现在名为docker-ce
如果有安装过旧版本, 卸载它们以及相关依赖
1 | sudo yum remove docker \ |
如果yum提示没有安装过这些包也没有问题
在/var/lib/docker/中的镜像, 容器, 持久化数据, 和网络的内容会被保留
安装
Docker有多种安装方法, 这里介绍其中一种
通过存储库安装
在一台新机器上首次安装Docker前, 需要先配置Docker存储库(repository). 然后你就可以通过存储库来安装Docker
配置存储库
安装yum-utils包(它提供了yum-config-manager功能)并配置stable的存储库
1 | sudo yum install -y yum-utils |
安装Docker引擎
安装最新版本的
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用户组, 但是不会添加任何用户启动
Docker1
sudo systemctl start docker
通过运行
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

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

获取应用
在运行应用之前, 我们需要先获取应用的源代码. 一般真实的项目都会通过存储库拉取源代码, 但教程中直接使用一个已经创建好的zip文件
通过点击界面中的
Download the ZIP下载, 解压下载到的文件, 放到docker所在机器中打开文件夹, 你应该看到
package.json文件与两个分别名为src与spec的子文件夹
构建镜像
我们需要一个DockerFile文件来构建镜像
在
package.json的同级目录下新建一个名为DockerFile的文件, 不带后缀名添加如下内容
1
2
3
4
5
6FROM 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设置其他指令的执行路径COPY将docker所在本地文件拷贝到容器中CMD指定容器运行后的默认运行指令打开一个一个终端, 进入app文件夹下, 执行如下指令
1
docker build -t getting-started .
build指令将使用DockerFile进行镜像的构建-t让用户指定镜像名称, 此处指定为getting-started.指定源代码文件所在处为当前目录
开启一个应用容器
现在我们有了镜像, 可以运行程序了
通过指令使用容器来运行程序
1
docker run -dp 3000:3000 getting-started
-d指以detached模式运行, 后台运行-p指定端口映射,3000:3000冒号左侧为外部端口, 右侧为容器端口容器启动完成后, 访问
3000端口, 应该可以看到应用
可以尝试输入并添加
Item
至此, 已经成功地构建了一个镜像并在容器上运行
常用指令
镜像
构建镜像: docker build -t imageName /sourcePath
查看所有镜像: docker image list或docker 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 imageName或docker 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 bash或docker exec -it xx sh, 进入容器内后执行tail -f针对
Docker Swarm模式, 执行docker service logs containerIdDocker Swarm是Docker集群平台
引擎日志
Docker引擎自身产生的日志
查看日志: journalctl -u docker