Docker基础与实战

点击阅读全文

安装Docker

Linux

Linux中两种Docker安装方法,一种是使用Docker提供的自动安装脚本,另一种是使用Linux发行版的packaging system直接安装

自动安装脚本

Docker自动识别Linux发行版的类型,提供用于安装Docker包的脚本

1
sudo wget -q0- https://get.docker.com/ | sh

使用get.docker.com脚本安装Docker时,hello-world镜像也会自动安装。由于不使用hello-world镜像,故将其全部删除

1
2
sudo docker rm `sudo docker ps -aq`
sudo docker rmi hello-world

Ubuntu

1
2
3
sudo apt-get update
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

将/usr/bin/docker.io可执行文件链接到/usr/local/bin/docker并使用

Windows

1
https://github.com/boot2docker/windows-installer/releases

使用Docker

Docker命令格式为docker<命令>,比如docker run、docker push,且必须总是以root权限运行

使用search命令搜索镜像

1
sudo docker search ubuntu

使用pull命令下载镜像

从Docker hub下载Ubuntu Linux镜像

1
sudo docker pull ubuntu:latest

使用images命令列出镜像目录

1
sudo docker images

docker images命令用于列出本地主机中所有镜像。在该命令中设置镜像名称—比如docker images ubuntu—则只列出名称相同但标签不同的镜像

使用run命令创建容器

使用镜像创建容器后,运行Bash shell

1
sudo docker run -i -t --name hello ubuntu /bin/bash

命令格式为docker run<选项><镜像名称><要运行的文件>。将ubuntu镜像创建为容器后,运行ubuntu镜像中的/bin/bash。也可以不用镜像名称而用镜像ID

  • 使用 -i(interactive)、-t(Pseudo-tty)选项可以在运行的Bash shell中进行输入与输出
  • 使用 –name选项可以指定容器名称。若不指定名称,Docker会自动生成名称并进行指定

使用ps命令查看容器列表

1
sudo docker ps -a

使用start命令启动容器

1
sudo docker start hello

命令格式为docker start<容器名称>,也可以使用容器ID替代容器名称

使用restart命令重启容器

1
sudo docker restart hello

命令格式为docker restart<容器名称>,也可以使用容器ID替代容器名称

使用attach命令连接容器

执行如下命令后,再输入一次回车键,显示Bash shell

1
sudo docker attach hello

命令格式为docker attach<容器名称>,也可以使用容器ID替代容器名称
在Bash shell中输入exit或Ctrl+D终止容器,若依次输入Ctrl+P、Ctrl+Q则不会终止容器而只退出

使用exec命令从外部运行容器内的命令

当前容器正以/bin/bash形式处于运行状态,也可以不通过/bin/bash而从外部运行容器内的命令

1
sudo docker exec hello echo "Hello World"

命令格式为docker exec<容器名称><命令><形式参数>,也可以使用容器ID替代容器名称。

使用stop命令终止容器

1
sudo docker stop hello

使用rm命令删除容器

1
sudo docker rm hello

命令格式为docker rm<容器名称>,也可以使用容器ID替代容器名称。

使用rmi命令删除镜像

1
sudo docker rmi ubuntu:latest

命令格式为docker rm<镜像名称>:<标签>,也可以使用容器ID替代容器名称。

创建Docker镜像

编写Dockerfile

example/Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.com>
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-date:www-date /var/lib/nginx
VOLUME ["/date", "/etc/nginx/site-enabled", "/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
EXPOSE 443

  • FROM:指定基于的基础镜像。Docker镜像基于已创建的镜像。指令格式为<镜像名称><标签>
  • MAINTAINER:维护者信息
  • RUN:运行shell脚本或命令
  • CMD:指定容器启动时执行的文件或shell脚本
  • WORKDIR:为CMD中设置的可执行文件设置运行目录
  • EXPOSE:与主机相连的端口号

使用build命令创建镜像

Dockerfile文件编写完成后,在保存Dockerfile文件的example目录执行如下命令:

1
sudo docker build --tag hello:0.1

命令格式为docker build <选项>。使用–tag选项可以设置镜像名称与标签。

1
sudo docker run --name hello-nginx -d -p 80:80 -v /root/data:/data hello:0.1
  • -d 选项在后台运行容器
  • -p 80:80选项将主机的80端口与容器的80端口连接起来,并暴露到外部。这样设置后,连接http://<主机IP>:80就会连接到容器的80号端口
  • -v /root/data:/data选项将主机的/root/data目录连接到容器的/data目录。若将文件放入/root/data目录,则能从容器读取相应文件。

查看Docker

使用history命令查看镜像历史

1
sudo docker history hello:0.1

命令格式为docker history<镜像名称>:<标签>

使用cp命令复制文件

1
sudo docker cp hello-nginx:/etc/nginx/nginx.conf ./

命令格式为docker cp<容器名称>:<路径><主机路径>

使用commit命令从容器的修改中创建镜像

docker commit 命令从容器的修改中创建新的镜像
假设hello-nginx容器中的文件内容发生变化,将容器创建为镜像文件。

1
sudo docker commit -a "Foo Bar <foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2

命令格式为docker commit <选项><容器名称><镜像名称>:<标签>

-a “Foo Barfoo@bar.com“与 -m “add hello.txt”选项用于设置提交的用户与注册信息。将hello-nginx容器创建hello:0.2镜像

使用diff命令检查容器文件的修改

1
sudo docker diff hello-nginx

命令格式为docker diff<容器名称>,A为添加文件,C为修改的文件,D为删除的文件。

使用inspect命令查看详细信息

1
sudo docker inspect hello-nginx

命令格式为docker inspect<容器名称>