hemiy

1 Docker概述

Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用。首先来看Docker的架构图:

理解其中几个概念:

  • Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build,docker pull...)和配置标识,并与Docker daemon通信
  • Images(Docker镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像
  • Containers(容器):镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象
  • Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub

2 Docker安装

CentOS7系统下安装Docker为例。Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:

yum -y install docker

启动docker后台服务:

service docker start

验证是否安装成功:

[root@localhost hemi]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64
 Experimental:    false

更详细的针对各操作系统的安装见官方文档:https://docs.docker.com/install/

 

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。

请在该配置文件中加入(没有该文件的话,请先建一个):

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

 

3 Docker常用命令

3.1 镜像常用命令

1)搜索镜像

可以在Docker Hub主页上搜索镜像,可以通过docker search命令搜索,如:

docker search [OPTIONS] TERM

OPTIONS说明:

  • --automated : 只列出 automated build类型的镜像;
  • --no-trunc : 显示完整的镜像描述;
  • -s : 列出收藏数不小于指定值的镜像。
[root@localhost hemi]# docker search -s 20 tomcat
INDEX       NAME                                      DESCRIPTION           STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/tomcat                          Apache Tomcat is...   1757      [OK]       
docker.io   docker.io/dordoka/tomcat                  Ubuntu 14.04, Or...   48                   [OK]
docker.io   docker.io/tomee                           Apache TomEE is ...   47        [OK]       
docker.io   docker.io/davidcaste/alpine-tomcat        Apache Tomcat 7/...   24                   [OK]

其中,

STARTS:镜像仓库收藏数

AUTOMATED:表示是否是自动构建的镜像仓库

2)下载镜像

docker pull [OPTIONS] NAME[:TAG]

OPTIONS说明:

  • -a :拉取所有 tagged 镜像 
  • --disable-content-trust :忽略镜像的校验,默认开启

举个栗子

docker pull java   #从Docker Hub中下载最新版本的Java镜像
docker pull reg.itmuch.com/java:8    #从指定Registry中下载标签为8的Java镜像

3)列出镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:  

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests :显示镜像的摘要信息
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。

举个栗子:

列出本地镜像中REPOSITORY为ubuntu的镜像列表

[hemi@localhost ~]$ docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              0458a4468cbc        7 weeks ago         111.7 MB
docker.io/ubuntu    15.10               9b9cb95443b5        20 months ago       137.2 MB

4)删除本地镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:  

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除;

3.2 容器常用命令

 1)新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 OPTIONS说明(常用):

  • -d: 后台运行容器,并返回容器ID;
  • --name="nginx-lb": 为容器指定一个名称;
  • -i:以交互模式运行容器,通常与 -t 同时使用;
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -P: 随机端口映射;
  • -p: 指定端口映射,有以下四种格式
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • containerPort
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;

 如:

docker run --name mynginx -d nginx:latest
#使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run -p 91:80 -v /data:/data -d nginx:latest
#使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到主机的91端口,主机的目录/data映射到容器的/data。

[hemi@localhost ~]$ docker run -it nginx:latest /bin/bash 
root@b8573233d675:
/#
#使用镜像nginx:latest以交互模式启动一个容器,在容器内执行
/bin/bash命令。

2)列出容器

docker ps [OPTIONS]

 OPTIONS说明(常用):

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • --format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • --no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

3)停止容器

docker stop CONTAINER_ID/CONTAIN_NAME

4)强制停止容器

docker kill CONTAINER_ID/CONTAIN_NAME

5)启动已停止容器

docker start CONTAINER_ID/CONTAIN_NAME

6)重启容器

docker restart CONTAINER_ID/CONTAIN_NAME

7)进入容器

docker exec -it CONTAINER_ID bash

如:

[hemi@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                    NAMES
219371844a81        7f94db72116e        "tomcat.sh"         7 seconds ago       Up 7 seconds        8009/tcp, 8080/tcp, 0.0.0.0:91->80/tcp   zen_kalam
[hemi@localhost ~]$ docker exec -it 219371844a81 bash
bash-4.2$ 

8)删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

 OPTIONS说明(常用):

  • -f :通过SIGKILL信号强制删除一个运行中的容器
  • -l :移除容器间的网络连接,而非容器本身
  • -v :-v 删除与容器关联的卷

 

更多命令见Docker的官方文档https://docs.docker.com/edge/engine/reference/commandline/

也可以利用命令行查看,如:

docker rm --help

 

4 入门实战

此时浏览器访问结果如下表示正常 

再次访问浏览器如下结果,表示修改正常 

 

 但是此时如果重启容器,则之前的改动将失效。若要保存修改可以提交保存为新镜像↓

 

此过程还可以用Dockerfile完成

1、首先新建Dockerfile,内容如下:

2、在Dockerfile所在路径执行以下命令构建镜像,并运行:

浏览器访问


 

Dockerfile官方文档https://docs.docker.com/engine/reference/builder/

Dockerfile最佳实践https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

 

 5 Docker Compose

Docker Compose用来定义和运行多应用容器。使用Docker Compose大致有3个步骤:

  • 使用Dockerfile定义应用程序环境,应标在任何地方重现该环境
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
  • 运行docker-compose up 命令,启动并运行整个应用程序

5.1 安装Compose

①通过以下命令自动下载并安装适应系统版本的Compose:

curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

②为安装脚本添加执行权限:

chmod +x /usr/local/bin/docker-compose

安装完成。可以使用以下命令测试安装结果:

ocker-compose --version

5.2 安装Compose命令补全工具

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

输入docker-compose并按下Tab键,compose就可以自动补全命令了。

5.3 入门实例

 个人博客实例,含三个层,分别为nginx、ghost app、mysql

1、创建3个目录

2、进入ghost目录,创建两个文件

① Dockerfile

FROM ghost
COPY ./config.production.json /var/lib/ghost/config.production.json
EXPOSE 2368

 

config.production.json  

{
    "url": "http://localhost:2368/",
    "server": {
        "port": 2368,
        "host": "0.0.0.0"
    },
    "database": {
        "client": "mysql",
        "connection": {
            "host": "db",
            "user": "ghost",
            "password": "ghost",
            "database": "ghost",
            "port": 3306,
            "charset": "utf8"
        }
    },
    "mail": {
        "transport": "Direct"
    },
    "logging": {
        "transports": [
            "file",
            "stdout"
        ]
    },
    "process": "systemd",
    "paths": {
        "contentPath": "/var/lib/ghost/content"
    }
}

 

 3、进入nginx目录,配置

①Dockerfile

FROM docker.io/nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

②nginx.conf

worker_processes 4;
events {worker_connections 1024;}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://ghost-app:2368;
        }
    }
}

4、配置docker-compose.yml

 在blog目录下创建docker-compose.yml文件

version: \'2\'
networks:
  ghost:
services:
  ghost-app:
    build: ghost
    networks:
      - ghost
    depends_on:
      - db
    ports:
      - "2368:2368"
  nginx:
    build: nginx
    networks: 
      - ghost
    depends_on:
      - ghost-app
    ports:
      - "80:80"
  db:
    image: "mysql:5.7.15"
    networks:
      - ghost
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"

以上即可。随后在docker-compose.yml所在目录build镜像并运行

docker-compost stop         #停止容器   
docker-compose rm            #删除容器
docker-compose build         #重新建立
docker-compose up -d        #启动运行

 


 

docker-compose命令-官方文档https://docs.docker.com/compose/reference/overview/

 

分类:

技术点:

相关文章: