Docker 是一个开源的应用容器引擎,而一个容器其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的局限性之一,它只能用在 64 位的操作系统上。
一、安装 yum install docker apt-get install docker-ce pacman -S docker emerge --ask docker docker version
二、命令介绍 $ docker --help 管理命令: container 管理容器 image 管理镜像 network 管理网络 命令: attach 介入到一个正在运行的容器 build 根据 Dockerfile 构建一个镜像 commit 根据容器的更改创建一个新的镜像 cp 在本地文件系统与容器中复制 文件/文件夹 create 创建一个新容器 exec 在容器中执行一条命令 images 列出镜像 kill 杀死一个或多个正在运行的容器 logs 取得容器的日志 pause 暂停一个或多个容器的所有进程 ps 列出所有容器 pull 拉取一个镜像或仓库到 registry push 推送一个镜像或仓库到 registry rename 重命名一个容器 restart 重新启动一个或多个容器 rm 删除一个或多个容器 rmi 删除一个或多个镜像 run 在一个新的容器中执行一条命令 search 在 Docker Hub 中搜索镜像 start 启动一个或多个已经停止运行的容器 stats 显示一个容器的实时资源占用 stop 停止一个或多个正在运行的容器 tag 为镜像创建一个新的标签 top 显示一个容器内的所有进程 unpause 恢复一个或多个容器内所有被暂停的进程
三、服务管理 service docker start service docker stop chkconfig docker on
四、镜像管理 镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。
docker pull centos:latest docker images docker rm image_id docker rmi $(docker images | grep none | awk '{print $3}' | sort -r) docker run -t -i nginx:latest /bin/bash
4.1 通过容器创建镜像 我们可以通过以下两种方式对镜像进行更改。
从已经创建的容器中更新镜像,并且提交这个镜像
使用 Dockerfile 指令来创建一个新的镜像
下面通过已存在的容器创建一个新的镜像。
docker commit -m="First Docker" -a="wcjiang" a6b0a6cfdacf wcjiang/nginx:v1.2.1
上面命令参数说明 :
-m 提交的描述信息
-a 指定镜像作者
a6b0a6cfdacf 记住这个是容器id,不是镜像id
wcjiang/nginx:v1.2.1 创建的目标镜像名
4.2 发布自己的镜像
在Docker 注册账户,发布的镜像都在这个页面里 展示
将上面做的镜像nginx,起个新的名字nginx-test
docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
登录docker
上传nginx-test镜像
docker push wcjiang/nginx-test:lastest
4.3 镜像中安装软件
通常情况下,使用docker官方镜像,如 mysql镜像,默认情况下镜像中啥软件也没有,通过下面命令安装你所需要的软件:
apt-get update apt-get install vim
如果你安装了CentOS或者Ubuntu系统可以进入系统安装相关软件
docker run -i -t centos:7 /bin/bash yum update yum install vim
五、容器管理 容器就像一个类的实例
docker run centos echo "hello world" docker run centos yum install -y wget docker ps docker ps -a docker logs my-nginx docker run -i -t centos /bin/bash docker inspect centos docker commit 8bd centos docker commit -m "n changed" my-nginx my-nginx-image docker inspect -f {{.State.Pid}} 44fc0f0582d9
5.1 容器服务管理 docker run -itd --name my-nginx2 nginx docker start my-nginx --restart=always docker start my-nginx docker restart my-nginx docker stop my-nginx docker kill my-nginx docker rename my-nginx new-nginx docker rm new-nginx
5.2 进入容器
创建一个守护状态的Docker容器
docker run -itd my-nginx /bin/bash
使用docker ps查看到该容器信息
使用docker exec命令进入一个已经在运行的容器
docker exec -it 6bd0496da64f /bin/bash
通常有下面几种方式进入Docker的容器,推荐使用exec,使用attach一直进入失败。
六、使用Docker实战 6.1 部署Nginx 1.在 docker hub 中查找 nginx 相关镜像。
2.拉取官方镜像,其中上面的非官方镜像是用户们根据自己的需要制作的镜像,方便大家的使用。
3.利用这个镜像启动一个新的容器
docker run --name my-nginx -d -p 8080:80 nginx
4.查看容器运行日志
启动一个更复杂Nginx的例子:
docker run --name my-nginx \ -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /some/html:/usr/share/nginx/html:ro \ -p 8080:80 \ -d nginx
-v 参数语法为 -v host dir:container dir[:ro|rw]
--name 为容器取一个名字
-p 参数语法为 -p host port:container port; -p 8080:80 将主机上的8080端口绑定到容器上的80端口,因此在主机中访问8080端口时其实就是访问 nginx 容器的80端口
-d 后台运行容器
6.2 部署MySQL
拉取官方的镜像,标签为5.7,Docker官方资料 、MySQL 官方资料
创建目录
data目录将映射为mysql容器配置的数据文件存放路径
logs目录将映射为mysql容器的日志目录
conf目录里的配置文件将映射为mysql容器的配置文件
mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf
运行容器
docker run --name my-mysql \ -p 3306:3306 \ -v $PWD /conf/my.cnf:/etc/mysql/my.cnf \ -v $PWD /logs:/logs \ -v $PWD /data:/mysql_data \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
-p 3306:3306:将容器的3306端口映射到主机的3306端口
-v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf
-v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs
-v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
七、Docker私有仓库搭建
通过官方提供的私有仓库镜像registry来搭建私有仓库。通过 humpback 快速搭建轻量级的Docker容器云管理平台。关于仓库配置说明请参见configuration.md
7.1 部署registry docker pull registry:2.6.2
为了定制一些配置,和在 humpback 中使用,我们还需要提供一个定制化的配置文件(使用yml来编写配置文件),文件放在/etc/docker/registry/config.yml,如下:
version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :7000 secret: docker-registry headers: X-Content-Type-Options: [nosniff ] Access-Control-Allow-Headers: ['*' ] Access-Control-Allow-Origin: ['*' ] Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE' ] health: storagedriver: enabled: true interval: 10s threshold: 3
创建容器并运行,创建成功之后,可访问 http://192.168.99.100:7000/v2/,来检查仓库是否正常运行,当返回 {} 时,表示部署成功。
docker run -d -p 7000:7000 --restart=always \ -v /var/lib/registry/:/var/lib/registry/ \ -v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml \ --name humpback-registry \ registry:2.6.2
推送镜像到私有仓库
docker pull nginx:1.13 docker tag nginx:1.13 192.168.99.100:7000/test-nginx:1.13 docker push 192.168.99.100:7000/test-nginx:1.13
在推送到的时候报错误,默认是使用https提交,这个搭建的默认使用的是 http,解决方法两个:
创建一个https映射
将仓库地址加入到不安全的仓库列表中
我们使用第二种方法,加入到不安全的仓库列表中,修改docker配置文件vi /etc/docker/daemon.json 添加 insecure-registries配置信息。
{ "insecure-registries" :[ "192.168.99.100:7000" ] }
重启服务 service docker restart,默认情况下 push 是会报如下错误的:
docker push 192.168.99.100:7000/test-nginx:1.13
上面错误是SELinux强制访问控制安全系统,阻止导致的错误,通过下面方法禁用SELinux之后就可以push了。
7.2 部署Humpback
首先创建放持久化数据文件夹,mkdir -p /opt/app/humpback-web,里面存放持久化数据文件,会存储站点管理和分组信息,启动后请妥善保存。
mkdir -p /opt/app/humpback-webdocker pull humpbacks/humpback-web:1.0.0 docker run -d --net=host --restart=always \ -e HUMPBACK_LISTEN_PORT=7001 \ -v /opt/app/humpback-web/dbFiles:/humpback-web/dbFiles \ --name humpback-web \ humpbacks/humpback-web:1.0.0
访问站点,打开浏览器输入:·http://192.168.99.100:7001· ,默认账户:admin 密码:123456
八、参考资料 8.1 官方英文资源
8.2 中文资源
8.3 其它资源