NotePublic/Software/Applications/Docker/Docker_安装和使用.md

175 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout: post
title: "Docker 安装和使用"
subtitle: ""
description: "包括 Docker 的基本概念和使用方法。"
excerpt: "本文描述了 Docker 的一些基本概念,并给出创建和启动容器的基本方法。"
date: 2020-01-15 16:43:00
author: "Rick Chan"
tags: ["Applications", "Docker"]
categories: ["Software"]
published: true
---
## 安装
```sh
# Ubuntu
apt-get install docker.io
# Arch Linux/Manjaro
pacman -S docker
```
## 干掉讨厌的 sudo
```sh
# 如果还没有 docker group 就添加一个
sudo groupadd docker
# 将自己的登录名(${USER} )加入该 group 内。然后退出并重新登录就生效啦
sudo gpasswd -a ${USER} docker
# 重启 docker 服务
sudo systemctl restart docker
# 切换当前会话到新 group 或者重启 X 会话
# 注意,这一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
newgrp docker
OR
pkill X
```
## 使用镜像源
以 USTC 镜像源为例。
### 使用 upstart 的系统
在配置文件 /etc/default/docker 中的 DOCKER_OPTS 中配置 Hub 地址:
```sh
DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn/"
```
重新启动服务:
```sh
sudo service docker restart
```
### 使用 systemd 的系统
在 /etc/docker 下创建 daemon.json 文件,修改其内容并重启启动 docker 相关服务:
```sh
cd /etc/docker
sudo touch daemon.json
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
```
## 基本使用
Docker 的主要管理对象是镜像和容器,镜像是静态对象,保存了分层的用户数据;而容器是动态对象,可以看作镜像的运行状态,容器主要包容了 root fs。二者的关系如同程序文件与进程的关系。必须使用镜像来创建容器一旦 Docker 加载并运行了某镜像,就为之创建一个与之对应的容器,容器至少有 stop 和 run 两个状态。使用 run 命令通过镜像创建容器后,该容器处于 run 状态,使用 exit 命令脱离容器后,容器处于 stop 状态。可以使用 start 命令将处于 stop 状态的容器再次运行起来。
如果每次都使用 run 命令从同一个镜像创建容器,会发现两个容器是完全一样的,因为他们都有相同的起始点。容器使用后,会保存当前的使用状态,但如果希望将其当前状态保存成镜像,可以使用 commit 命令。
*image name 为 \<repository\>:\<tag\> 这种形式。*
*建议先配置使用镜像源。*
以下是使用 Docker 的一些基础命令:
```sh
# 从 docker hub 上搜索镜像
docker search [option] <keyword>
# 从 https://hub.docker.com 拉取镜像
docker pull ubuntu:18.04
# 运行某镜像并为之创建容器
docker run <image name/id>
# 运行某镜像,为之创建容器,将宿主机端口影射到容器端口,并将宿主机的某目录挂载到容器的对应目录下
docker run -it -p <host ip:port><container port> -v <host dir>:<container dir> <image name/id> /bin/bash
# 运行某镜像,为之创建容器,设置网络参数,并将宿主机的某目录挂载到容器的对应目录下
docker run --net=<bridge/host/container:container name or id/none> -it -v <host dir>:<container dir> <image name/id> /bin/bash
# 查看正在运行的容器
docker ps
# 提交针对某容器的修改,将其保存为镜像
docker commit <container id> <repository>:<tag>
# 退出并关闭容器:在容器的 shell 中直接
exit
# 运行某已存在的容器
docker start <container id>
docker attach <container id>
# 在某已运行的容器中执行命令
docker exec -it <container name/id> <cmd and args>
# 迁移镜像
docker save -o <tar file> <image name/id>
docker load -i <tar file>
# 迁移容器
docker export -o <tar file> <container name/id>
docker import <tar file> <repository>:<tag>
```
想要退出但不关闭容器,在容器中按下 Ctrl + P + Q 组合健即可.
如果想退出容器但又不想让容器停止,使用 ctrl+p+q 即可。
### 容器操作
```sh
# 获得容器信息
docker container ls -a
# 获得容器id
docker container ls -a -p
# 停止容器
docker container stop <container id>
# 删除容器
docker container rm <container id>
```
### 镜像操作
```sh
# 获得镜像信息
docker image ls -a
# 获得镜像id
docker image ls -a -p
# 重命名镜像
docker tag <image name/id> <repository>:<tag>
# 删除镜像
docker image rm <image name/id>
```
## 网络模式说明
### bridge 模式
Docker 容器默认使用 bridge 模式的网络。其特点如下:
* 使用一个 linux bridge默认为 docker0
* 使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
* 该模式下Docker Container不具有一个公有IP因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
* Docker采用 NAT 方式将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
* 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
* NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。
* 容器拥有独立、隔离的网络栈让容器和宿主机以外的世界通过NAT建立通信
### host 模式
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace故 Docker Container可以和宿主机一样使用宿主机的eth0实现和外界的通信。换言之Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。其特点包括:
* 这种模式下的容器没有隔离的 network namespace
* 容器的 IP 地址同 Docker host 的 IP 地址
* 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
* host 模式能够和其它模式共存
### container 模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。
### none 模式
网络模式为 none即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式那么容器内部就只能使用loopback网络设备不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境容器只能使用127.0.0.1的本机网络。