Docker 首接触

引子

首次接触Docker
第一次知道Docker是从Kali的课堂上知道的,现在发现它很不错,值得学习

读者

没接触过Docker的运维人员,半运维人员,对Docker感兴趣的同学

环境

  • Centos 7
  • Docker 1.12

Docker 是什么 ?

Docker 是一个开源工具,它可以让创建和管理 Linux容器变得简单。容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止。Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点。

容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。容器使用宿主操作系统的内核,而虚拟机使用独立的内核。

Docker 的局限性之一是,它只能用在 64 位的操作系统上。

Docker 的一些理解

Docker 的镜像文件【images】是不能修改的,只读的
Docker 的架构是镜像叠加,所以镜像文件尽量不要有冗余操作
Docker 的容器是一个可读的镜像,是在镜像之上又架了一层可写的镜像,这个镜像经过修改,可以作为镜像出现
Docker 最让我觉得很好的地方是很多环境搭建变得简单了,然后也比较简洁

安装

1
yum install docker

启动Docker服务

旧语法

1
2
service docker start 				//启动Docker
chkconfig docker on // 配置开机启动

新语法

1
2
systemctl start docker.service 		//启动Docker
systemctl enable docker.service // 配置开机启动

下载Centos镜像文件

1
2
docker pull centos  		//获取centos镜像
docker images //查看镜像列表

运行一个Docker容器

1
docker run -i -t centos /bin/bash

运行一个Docker容器,使用-i 捕获输入输出,-t 分配一个终端挥着控制台
断开容器的连接,输入exit

查看当前正在运行的容器列表

1
docker ps

进入当前正在运行的容器

exec 命令

docker exec 是Docker內建的命令。

1
2
3
4
5
6
7
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker exec -it nostalgic_hypatia bash
root@243c32535da7:/#

attach 命令

docker attach 亦是Docker內建的命令。

1
2
3
4
5
6
7
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

按下 ctrl + P 然後 ctrl + Q 跳離容器,讓它繼續在背景執行。
但是使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。當某個窗口因命令阻塞時,其他窗口也無法執行操作了。

nsenter 命令

安裝

nsenter 工具已含括在 util-linux 2.23 後的版本內。 如果系統中 util-linux 包沒有該命令,可以按照下面的方法從原始碼安裝。

1
2
3
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

使用

nsenter 可以存取另一個程式的命名空間。nsenter 要正常工作需要有 root 權限。 很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安裝最新版本的 util-linux(2.24)版,請按照以下步驟:

1
2
3
4
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin

為了連接到容器,你還需要找到容器的第一個程式的 PID,可以透過下面的命令取得。

1
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

透過這個 PID,就可以連接到這個容器:

1
$ nsenter --target $PID --mount --uts --ipc --net --pid

下面給出一個完整的例子。

1
2
3
4
5
6
7
8
9
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$ PID=$(docker-pid 243c32535da7)
10981
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#

更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。

1
2
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc

這個檔案中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以取得某個容器的 PID;而 docker-enter 可以進入容器或直接在容器內執行命令。

1
2
$ echo $(docker-pid <container>)
$ docker-enter <container> ls

更换Docker国内源

1
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://43049fd0.m.daocloud.io

后续需要提高的地方

  • Docker 更换源
  • Docker 制作高品质的镜像文件
  • 使用 Docker 仓库存储自己的镜像文件
  • Docker 镜像升级
  • docker-compose 配置