一、Docker是什么?

Docker 依赖unix内核 运行在Linux上的容器不同于虚拟机,Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。 Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。

二、Docker的技术简介

(每个容器都单独分配计算机进程、root文件系统、IP地址、cpu、内存等资源)

Namespaces 命名空间

  • PID(Process ID)进程隔离
  • NET(Network)管理网络接口
  • IPC(IntePrcess Communication)管理跨进程通信的访问
  • MNT(Mount)挂载点(文件系统)
  • UTS(Unix Timesharing System)隔离内核和版本标识

Unix Control groups 控制组

  • 资源限制
  • 优先级设定
  • 资源计量
  • 资源控制

Docker 基于Control groups 分配计算机资源给各个容器,是一个通过联合加载技术形成的只读文件系统

三、安装Docker(Ubuntu)

**方法一:*需要检查 Ubuntu 内核版本是否支持 Docker,官方已经将安装docker的过程写入一个shell脚本中,我们只需要下载并执行这个脚本即可

  1. 检查是否安装 curl (若安装可跳过)
1
sudo apt-get install -y curl
  1. 获取脚本并安装(示例:Ubuntu的安装方式)
1
curl -fsSL https://get.docker.com | sudo sh

方法二:命令行安装

  1. 如果之前安装过docker,执行下面命令删除
1
2
apt-get remove docker docker-engine docker.io
sudo apt-get update
  1. 安装必要的软件包以允许apt通过HTTPS使用存储库,具体如下:
1
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  1. 添加GPG密钥,可以添加官方的和阿里的,我添加的阿里的,国内的快啊
1
2
3
4
// 官方
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// 阿里
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

添加完毕后可以执行以下命令验证:

1
sudo apt-key fingerprint 0EBFCD88

正常情况下会输出如下内容,说明 Ok,继续:

1
2
3
4
pub   rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ 未知 ] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
  1. 设定稳定仓储库,这一步我被坑了好久,具体参考 docker 配置仓储库时出错:无法安全地用该源进行更新,所以默认禁用该源,也可以不设置,不设置默认使用官方的,具体是:deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable同样可以用阿里 的镜像:设置命令如下:
1
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

*注意:*其中的lsb_release -cs相当于一个函数,直接获取Ubuntu下的最新版本,设置完毕再次执行

1
sudo apt-get update
  1. 安装docker
1
sudo apt-get -y install docker-ce

也可以指定想安装 的docker版本,执行如下命令命令查看有哪些版本

1
apt-cache madison docker-ce

输出如下:

1
2
3
4
docker-ce | 5:18.09.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.06.0~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
docker-ce | 18.03.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

选择要安装的版本,执行

1
sudo apt-get install -y docker-ce=<VERSION>

安装完成 后执行

1
docker -v

如果正常输出说明安装成功

四、非root用户使用Docker

非root用户使用docker会异常卡顿,官方推荐了一种非root用户使用的方式

  1. 添加docker 用户组
1
sudo groupadd docker
  1. 将当前用户添加到用户组中
1
sudo gpasswd -a '你的用户名' docker
  1. 重启 docker
1
sudo service docker restart
  1. 运行 docker 命令
1
docker version

注意:需注销当前用户重新登录,不然会报错(FATA[0000])!

五、 容器的基本操作

1
2
3
4
docker run IMAGE [COMMAND] [ARG..](启动命令格式)
例:docker run ubuntu echo 'hello world'
root@wkaanig:~# docker run ubuntu echo 'hello world'
hello world

1. 启动交互式命令(只执行一次)

1
2
3
4
5
6
7
8
9
docker run -i-t IMAGE /bin/bash (启动交互式命令 -i --interactive 标准服务 -t --tty 打开tty终端)
例:docker run -i -t ubantu /bin/bash
root@wkaanig:~# docker run -i -t ubuntu /bin/bash
root@72328d172f8f:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 07:40 pts/0 00:00:00 /bin/bash
root 10 1 0 07:40 pts/0 00:00:00 ps -ef
root@72328d172f8f:/# exit
exit

2. 查看容器

1
2
3
4
5
6
docker ps [-a] [-l](-a 所有的容器 -l 最新的容器)
docker inspect "你想查询的 CONTAINER ID" (查看详情)
示例:root@wkaanig:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81046a796b82 ubuntu "echo 'hello world'" 3 minutes ago Exited (0) 3 minutes ago dazzling_hugle
72328d172f8f ubuntu "/bin/bash" 4 minutes ago Exited

3. 自定义容器名

1
2
docker run --name=自定义名 -i -t IMAGE /bin/bash
查询:docker inspect 自定义名

4. 重新启动停止的容器

1
docker start [-i]  容器名

5. 删除已停止的容器

1
docker rm 容器名

小结

1
2
3
4
5
6
docker run -i -t --name
docker ps -a -l
docker inspect
docker start -i
docker start -i
docker rm

六、守护式容器

1. 以守护形式运行容器

1
2
3
4
5
6
docker run -i -t IMAGE /bin/bash
Ctrl+P Ctrl+Q (使容器后台运行)
示例:root@wkaanig:~# docker run -i -t ubuntu /bin/bash
root@7b296d75cd4b:/# root@wkaanig:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b296d75cd4b ubuntu "/bin/bash" 15 seconds ago Up 14 seconds busy_boyd

2. 附加到运行中的容器(即将 docker 容器放置前台运行)

1
docker attach 容器名(ID 或 Name)

3. 启动守护式容器(以后台的方式)

1
2
3
4
5
6
docker run -d IMAGE [COMMAND] [ARG..]
示例:root@wkaanig:~# docker run --name dc1 -d ubuntu /bin/sh -c "while true;do echo hello word;sleep 1;done"
df0b3043010d986371a4a9d94fa72f28fddc4f69a38d89690078ced9cca528cb
root@wkaanig:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df0b3043010d ubuntu "/bin/sh -c 'while t…" 10 seconds ago Up 9 seconds dc1

4. 查看容器的运行情况(即日志)

1
2
3
4
5
6
7
8
docker logs [-f] [-t] [--tail] 容器名
-f --follows 跟踪
-t --timestamps 时间戳
--tail="all" 日志数量
示例:
root@wkaanig:~# docker logs -ft --tail=0 dc1
2019-09-17T08:19:57.987090981Z hello word
2019-09-17T08:19:58.988018019Z hello word

5. 查看容器内进程

1
docker top 容器名

6. 在运行中的容器内启动新进程

1
docker exec [-d] [-i] [-t] 容器名 [COMMAND] [ARG...]

7. 停止守护式容器

1
2
docker stop 容器名
docker kill 容器名 (快速停止)

小结

1
2
3
4
5
6
Ctrl+P Ctrl+Q
docker run -d
docker logs
docker top
docker exec
docker stop/kill