Docker入门手册
Docker入门手册
说明
本文环境为CentOS 7虚拟机, 并通过宿主机访问运行项目, 访问容器时的ip地址请根据自身环境进行修改
本文多数内容为官方文档的节选翻译与修改
介绍
懒得看就跳过吧
什么是
Docker
Docker
是一个开源的容器引擎, 可以允许任意语言实现的项目或模块从框架中拆出, 打包成镜像
(image
)后在容器
(Container
)内运行为什么用
Docker
Docker
可以通过统一的方式进行部署容器
的性能开销极低, 且相互之间没有接口什么是
容器
(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
用户组, 但是不会添加任何用户启动
Docker
1
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 containerId
Docker Swarm是Docker集群平台
引擎日志
Docker
引擎自身产生的日志
查看日志: journalctl -u docker