Docker小结篇

栏目: 服务器 · 发布时间: 6年前

内容简介:镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。我们可以通过以下两种方式对镜像进行更改。

Docker 是一个开源的应用容器引擎,而一个容器其实是一个虚拟化的独立的环境,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  • Docker 的局限性之一,它只能用在 64 位的操作系统上。

一、安装

yum install docker        # CentOS 中安装
apt-get install docker-ce # Ubuntu 中安装
pacman -S docker          # Arch 中安装
emerge --ask docker       # Gentoo 中安装

#=====================

docker version      # 通过查看版本,检查安装是否成功
# Client:
#  Version:         1.12.6
#  API version:     1.24
#  Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
#  Go version:      go1.8.3
#  Git commit:      c4618fb/1.12.6
#  Built:           Thu Sep 21 22:33:52 2017
#  OS/Arch:         linux/amd64
# 
# Server:
#  Version:         1.12.6
#  API version:     1.24
#  Package version: docker-1.12.6-55.gitc4618fb.el7.centos.x86_64
#  Go version:      go1.8.3
#  Git commit:      c4618fb/1.12.6
#  Built:           Thu Sep 21 22:33:52 2017
#  OS/Arch:         linux/amd64

二、命令介绍

$ 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       # 启动  docker  服务,守护进程
service docker stop        # 停止 docker 服务
chkconfig docker on        # 设置为开机启动

四、镜像管理

镜像可以看做我们平时装系统的镜像,里面就是一个运行环境。

docker pull centos:latest  # 从docker.io中下载centos镜像到本地
docker images              # 查看已下载的镜像
docker rm image_id         # 删除镜像,指定镜像id

# 删除所有镜像
# none 默认为 docker.io
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)

# 连接进行进入命令行模式,exit命令退出。
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
wcjiang/nginx:v1.2.1

4.2 发布自己的镜像

  1. Docker 注册账户,发布的镜像都在 这个页面里 展示
  2. 将上面做的镜像 nginx ,起个新的名字 nginx-test
docker tag wcjiang/nginx:v1.2.1 wcjiang/nginx-test:lastest
  1. 登录 docker
docker login
  1. 上传 nginx-test 镜像
docker push wcjiang/nginx-test:lastest
# The push refers to a repository [docker.io/wcjiang/nginx-test]
# 2f5c6a3c22e3: Mounted from wcjiang/nginx
# cf516324493c: Mounted from wcjiang/nginx
# lastest: digest: sha256:73ae804b2c60327d1269aa387cf782f664bc91da3180d10dbd49027d7adaa789 size: 736

4.3 镜像中安装软件

通常情况下,使用 docker 官方镜像,如 mysql 镜像,默认情况下镜像中啥软件也没有,通过下面命令安装你所需要的软件:

# 第一次需要运行这个命令,确保源的索引是最新的
# 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
apt-get update
# 做过上面更新同步之后,可以运行下面的命令了
apt-get install vim

如果你安装了 CentOS 或者 Ubuntu 系统可以进入系统安装相关软件

# 进入到centos7镜像系统
docker run -i -t centos:7 /bin/bash
yum update
yum install vim

五、容器管理

容器就像一个类的实例

docker run centos echo "hello world"  # 在docker容器中运行hello world!
docker run centos yum install -y wget # 在docker容器中,安装wget软件
docker ps                           # 列出包括未运行的容器
docker ps -a                        # 查看所有容器(包括正在运行和已停止的)
docker logs my-nginx                # 查看 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 # 获取id为 44fc0f0582d9 的PID进程编号

5.1 容器服务管理

docker run -itd --name my-nginx2 nginx # 通过nginx镜像,【创建】容器名为 my-nginx2 的容器
docker start my-nginx --restart=always    # 【启动策略】一个已经存在的容器启动添加策略
                               # no - 容器不重启
                               # on-failure - 容器推出状态非0时重启
                               # 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 进入容器

  1. 创建一个守护状态的 Docker 容器
docker run -itd my-nginx /bin/bash
  1. 使用 docker ps 查看到该容器信息
docker ps
# CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# 6bd0496da64f        nginx               "/bin/bash"         20 seconds ago      Up 18 seconds       80/tcp              high_shirley
  1. 使用 docker exec 命令进入一个已经在运行的容器
docker exec -it 6bd0496da64f /bin/bash

通常有下面几种方式进入 Docker 的容器,推荐使用 exec ,使用 attach 一直进入失败。

六、使用Docker实战

6.1 部署Nginx

1.在 docker hub 中查找 nginx 相关镜像。

$ docker search nginx

# INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# docker.io   docker.io/nginx                                                  Official build of Nginx.                        7006      [OK]
# docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1137                 [OK]
# docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   453                  [OK]
# docker.io   docker.io/jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as...   230                  [OK]
# docker.io   docker.io/kong                                                   Open-source Microservice & API Management ...   116       [OK]
# docker.io   docker.io/webdevops/php-nginx                                    Nginx with PHP-FPM                              90                   [OK]

2.拉取官方镜像,其中上面的非官方镜像是用户们根据自己的需要制作的镜像,方便大家的使用。

$ docker pull nginx
# Using default tag: latest
# Trying to pull repository docker.io/library/nginx ...
# latest: Pulling from docker.io/library/nginx
# bc95e04b23c0: Pull complete
# 110767c6efff: Pull complete
# f081e0c4df75: Pull complete
# Digest: sha256:004ac1d5e791e705f12a1

3.利用这个镜像启动一个新的容器

docker run --name my-nginx -d -p 8080:80 nginx
# faaed6a2d63af248961aab59713e515c76aea447

4.查看容器运行日志

docker logs my-nginx

启动一个更复杂 Nginx 的例子:

# 上面的命令将本地文件中的 nginx.conf 配置文件挂载到容器,并且将要展示的静态页面也挂载到容器。
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.7Docker官方资料MySQL 官方资料

docker pull mysql:5.7
# Trying to pull repository docker.io/library/mysql ...
# 5.7: Pulling from docker.io/library/mysql
# 85b1f47fba49: Already exists
# f34057997f40: Pull complete
# ....
# Digest: sha256:bfb22e93ee87c6aab6c1c9a4e70f28fa289f9ffae9fe8e173

创建目录

  • 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
# 为镜像 `nginx:1.13` 创建一个新标签 `192.168.99.100:7000/test-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
# The push refers to a repository [192.168.99.100:7000/test-nginx]
# Get https://192.168.99.100:7000/v1/_ping: http: server gave HTTP response to HTTPS client

在推送到的时候报错误,默认是使用 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
# The push refers to a repository [192.168.99.100:7000/test-nginx]
# a1a53f8d99b5: Retrying in 1 second
# ...
# received unexpected HTTP status: 500 Internal Server Error

上面错误是 SELinux 强制访问控制安全系统,阻止导致的错误,通过下面方法禁用 SELinux 之后就可以push了。

setenforce 0  
getenforce   
# Permissive

7.2 部署Humpback

首先创建放持久化数据文件夹, mkdir -p /opt/app/humpback-web ,里面存放持久化数据文件,会存储站点管理和分组信息,启动后请妥善保存。

# 创建放持久化数据文件夹
mkdir -p /opt/app/humpback-web
# 下载humpback-web镜像到本地
docker pull humpbacks/humpback-web:1.0.0
# 启动 humpback-web 容器,将容器命名为 humpback-web
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


以上所述就是小编给大家介绍的《Docker小结篇》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python高效开发实战——Django、Tornado、Flask、Twisted(第2版)

Python高效开发实战——Django、Tornado、Flask、Twisted(第2版)

刘长龙 / 电子工业出版社 / 2019-1 / 99

也许你听说过全栈工程师,他们善于设计系统架构,精通数据库建模、通用网络协议、后端并发处理、前端界面设计,在学术研究或工程项目上能独当一面。通过对Python 3及相关Web框架的学习和实践,你就可以成为这样的全能型人才。 《Python高效开发实战——Django、Tornado、Flask、Twisted(第2版)》分为3篇:上篇是Python基础,带领初学者实践Python开发环境,掌握......一起来看看 《Python高效开发实战——Django、Tornado、Flask、Twisted(第2版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码