Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。我们可以通过将开发代码打包到docker 镜像中,上传到docker hub中,待发布时通过拉取docker hub镜像启动docker 容器,实现代码运行环境的高度一致,并提高部署效率。
本篇文章就我们较为常用的docker 命令使用通过场景使用的不同来简单介绍。
Docker 安装与镜像加速
Docker安装
docker 提供了各种不同系统的安装方式,因为我们常用的正式部署环境使用centos的缘故,我这里只介绍centos里如何安装docker以及如何配置docker国内镜像加速。
- 使用官方提供的脚本自动安装
$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 手动命令行安装
# 先卸载旧版本的docker安装包,后安装新版 $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine $ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
镜像加速
- 阿里云
$ sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 清华大学源
$ sudo yum-config-manager \ --add-repo \ https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 腾讯源
$ sudo yum-config-manager \ --add-repo \ https://mirror.ccs.tencentyun.com/docker-ce/linux/centos/docker-ce.repo
启动docker 服务
$ sudo systemctl restart docker
Docker 核心概念
镜像
Docker镜像是由文件系统叠加而成。一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。整理可以得出镜像的两个特点:
- 镜像是分层的
- 镜像是只读的
- 常用命令
docker image ls # 枚举本地主机中的docker镜像 docker image inspect nginx:latest # 获取nginx:latest镜像的层数据和元数据 docker rmi nginx:latest # 删除本地的nginx:latest,需要先删除应用该镜像的容器 docker tag nginx:latest nginx:test # 给本地nginx:latest镜像添加标签nginx:test docker commit -a a404c6c174a2 mymysql:v1 # 基于当前容器a404c6c174a2创建新的镜像mymysql:v1 docker build -f Dockerfile -t myimage:0.0.1 . # 基于Dockerfile文件制作镜像myimage:0.0.1
容器
容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。
Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
- 常用命令
docker ps -a # 列出当前主机中所有的docker容器 docker run -it nginx /bin/bash # 基于nginx镜像启动一个docker容器 docker pause containername # 暂停docker 容器 docker start containername # 启动docker容器 docker stop containername # 停止docker容器 docker restart containername # 重启docker容器 docker attach -it containername /bin/bash # 进入docker 容器,此种方式进入退出后会使得docker容器停止 docker exec -it containername /bin/bash # 进入docker 容器,此种方式进入退出后不会使得docker容器停止 docker export containername > containername.tar # 导出docker容器快照 docker rm containername # 删除docker 容器 docker logs -f containername # 持续输出docker容器的日志信息 docker cp containerID:container_path host_path # 复制主机文件到对应docker容器的地址
仓库
Docker 仓库是用来包含镜像的位置。Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
- 常用命令
docker pull nginx:latest # 从镜像仓库拉取nginx:latest镜像 docker search nginx # 搜索镜像库的nginx相关镜像 docker push nginx:0.0.1 # 提交本地镜像nginx:0.0.1到当前登录的镜像仓库
一个简单的docker 使用示例
- 制作Dockerfile文件
Dockerfile 文件 FROM nginx:alpine ADD deploy/qas/default.conf /etc/nginx/conf.d ADD dist /home/html/app/ deploy/qas/default.conf server{ listen 8080; location ^~ /proxy-path/ { #自定义头信息传递 proxy_pass http://****/; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; } location / { #配置代理参数 proxy_redirect off; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port;#这里是重点,这样配置才不会丢失端口 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; root /home/html/app/; index index.html; try_files $uri /index.html; } } dist为打包文件
- 制作Docker镜像
docker build -f ./deploy/qas/Dockerfile -t website:0.0.1 .
- 上传Docker镜像
docker tag website:0.0.1 website/test docker images docker push website/test
- 启动docker 容器
docker pull website/test docker run -it --name website-test -p 80:80 -d website/tes
- 查看docker 容器运行状态
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90cdb9ad1ae1 website/tes "nginx -g 'daemon of…"