Docker入门
Docker介绍
关于 Docker 是什么,有个著名的隐喻:集装箱。但是它却起了个“码头工人”(docker 的英文翻译)的名字。这无疑给使用者很多暗示:“快来用吧!用了 Docker,就像世界出现了集装箱,这样你的业务就可以随意的、无拘无束的运行在任何地方(Docker 公司的口号:Build,Ship,and Run Any App,Anywhere),于是码头工人就基本都可以下岗了。”但是人们往往忽略了一个问题,隐喻的好处是方便人理解一个不容易理解的概念,但并不能解释其概念本身。 —————————邹立巍《什么是 Docker?》
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker主要关键词是容器和镜像,可以从仓库中获取所需要的镜像,通过镜像创建容器。每一个容器都相当于一个完全独立的虚拟机(Docker不是虚拟机),但是所占用内存消耗和启动时间等都远远小于虚拟机。在容器中可以根据所需安装软件,部署应用服务等。
Docker与Vm对比
图中可以看出docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有优势。docker利用的是宿主机的内核,而不需要Guest OS,因此新建一个docker容器只需要几秒钟。docker不需要增加Guest OS,所以在一台物理机上我们可以很容易建立成百上千的容器,而只能建立几个虚拟机。
安装Docker
docker的安装非常简单,centOs中直接使用
yum install docker
即可安装。
Docker基础命令
- 启动docker
1
2
3service docker start #启动
service docker stop #停止
service docker restart #重启 - 运行创建容器
1
2
3sudo docker run -i -t ubuntu /bin/bash
-i 保证容器中STDIN是开启的。STDIN是标准输入,一般指键盘输入到缓冲区里的东西。
-t 为创建的容器分配一个伪tty终端。 - 安装Vim
1
apt-get update && apt-get install vim #容器中执行
- 退出容器
1
exit
- 查看容器列表
1
2
3
4docker ps #列出所有运行中的容器
docker ps -a #列出所有容器
docker PS -l #列出最后一次运行的容器
docker PS -n x #列出最后一次运行的x个容器 - 创建指定名称的容器
1
sudo docker run --name reallinxu -i -t ubuntu /bin/bash
- 删除容器
1
docker rm reallinxu #可以通过容器名称、CONTAINER ID删除
- 启动容器
1
2docker start b74cf5d6a711 #启动一个已停止的容器
docker restart b74cf5d6a711 #重新启动容器 - 附着容器会话
1
docker attach 48db85aa8845
- 创建守护容器
1
2
3sudo docker run --name daemon_aaa -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
#-d docker会让容器后台运行
#-c 设置容器CPU权重,在CPU共享场景使用 - 获取容器日志
1
2
3
4sudo docker logs daemon_aaa #输出最后几条log
sudo docker logs -f daemon_aaa #动态监控log
docker logs --tail 10 daemon_aaa #获取日志最后10行
docker logs --tail 0 -f daemon_aaa #跟踪容器最新log - 查看容器内进程
1
sudo docker top daemon_aaa
- 在容器内部运行进程
1
2
3
4sudo docker exec -d daemon_aaa touch /etc/new_config_file
#-d 表示需要运行一个后台进程
sudo docker exec -t -i daemon_aaa /bin/bash
#创建一个新的bash会话,通过docker exec可以在运行中的容器中进行操作管理 - 停止守护容器
1
2sudo docker stop daemon_aaa #向容器发送SIGTERM信号
sudo docker kill daemon_aaa #向容器发送SIGKILL信号,可以快速停止 - 自动重启容器
1
2
3
4sudo docker run --restart=always --name daemon_ccc -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
#--restart=always 无论退出代码是什么都会自动重启
#--restart=on-failure 退出代码非0时重启
#--restart=on-failure:5 非0时重启,最多重启5次 - 获取容器信息
1
2
3
4docker inspect daemon_aaa #查看容器详细信息
docker inspect --format='{{.State.Running}}' daemon_aaa #查看指定属性,区分大小写
docker inspect --format='{{.State.Running}} {{.Name}}' daemon_aaa daemon_bbb #查看多个容器多个属性
#所有容器都放在/var/lib/docker/containers文件夹下 - 删除所有容器小技巧
1
docker rm `docker ps -a -q` #返回所有容器id传给rm
使用docker镜像和仓库
- 拉取指定仓库的镜像,默认为latest
1
docker pull ubuntu
- 查看本地镜像
1
docker images
- 镜像标签
1
2docker run -t -u --name haha ubuntu:12.04 /bin/bash
#通过镜像ubuntu:12.04启动一个容器,不指定标签则为latest - docker hub上查找镜像
1
docker search puppet
- docker commit方法构建
dockerhub注册账号:https://hub.docker.com/
登录dockerhub1
2
3
4
5
6
7docker login #登录dockerhub,个人认证信息保存在$HOME/.dockercfg
sudo docker commit 9de0d8b43b0f reallinxu/ubuntu1 #提交一个镜像
docker commit -m="test" --author="reallinxu" 1d61b09d590d reallinxu/hah:hah
#-m 提交信息
#--author 作者
#:hah 标签
#docker commit提交的只是创建的容器与容器的当前状态有差异的部分,这使得更新非常轻量 - dockerfile方法构建
创建文件1
2
3
4
5
6
7
8
9
10
11mkdir static_web
cd static_web
touch Dockerfile
vi Dockerfile
# Version: 0.0.1
FROM ubuntu:14.04 #从指定镜像创建容器
MAINTAINER reallinxu "xxxxx@qq.com" #指定用户名和作者
RUN apt-get update #更新apt-get
RUN apt-get install -y nginx #安装ngnix
RUN echo 'Hi,I am in your container' >/usr/share/nginx/html/index.html
EXPOSE 80 #向外部公开80端口,可以公开多个端口 - docker build构建镜像
1
2
3
4sudo docker build -t="reallinxu/static_web" . #默认latest标签
sudo docker build -t="reallinxu/static_web:v1" . #指定标签
sudo docker build -t="reallinxu/static_web:v1" gitURL #可以通过git根目录下文件构建
#build时会按照文件顺序一步步执行 - 镜像推送到dockerhub
1
2sudo docker commit 9de0d8b43b0f reallinxu/ubuntu1:test #构建镜像的时候最好加上tag,不加可能会报错
sudo docker push 9de0d8b43b0f reallinxu/ubuntu1:test #推送到dockerhub - 删除镜像
1
2docker rmi reallinxu/ubuntu1:test
docker rmi `docker images -a -q` #小技巧,返回所有镜像ID,再移除
Docker进阶
启动阿里云加速
docker的镜像仓库在国外,下载会很慢,启用阿里云加速。在/etc/docker目录下创建daemon.json文件,添加如下内容
1
2
3
4
5
6{
"registry-mirrors": ["https://almtd3fa.mirror.aliyuncs.com"]
}
#https://almtd3fa.mirror.aliyuncs.com为阿里云的加速地址。修改后,重启docker
systemctl daemon-reload
service docker restart
Docker中运行jar
- 下载java8镜像:
1
docker pull frolvlad/alpine-oraclejdk8
- 创建一个简单的spring-boot项目,开放8080端口,生成可执行的jar文件。
- 将demo-0.0.1-SNAPSHOT.jar放到/usr下,执行命令创建容器并执行jar
1
2
3docker run -d -p 8080:8080 -v /usr/demo-0.0.1-SNAPSHOT.jar:/usr/demo-0.0.1-SNAPSHOT.jar --name springboot frolvlad/alpine-oraclejdk8 java -jar /usr/demo-0.0.1-SNAPSHOT.jar
#-d 容器后台运行
#-p 主机端口与容器端口映射 - 浏览器中输入ip:8080验证是否启动成功。
docker宿主机与容器文件交互
- 从主机复制到容器 从容器复制到主机
1
sudo docker cp host_path containerID:container_path
1
sudo docker cp containerID:container_path host_path
- 挂载数据卷
1
2docker run -v /path/to/hostdir:/mnt $container(image name or image id) 在容器内拷贝
cp /mnt/sourcefile /path/to/destfile