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 | sudo docker rm `sudo docker ps -aq` |
Ubuntu
1 | sudo apt-get update |
将/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 <选项>
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<容器名称>