开始 - 图2

  • 概述
  • 安装
  • 命令

    Docker

是什么

docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。

docker的接口相当简单,用户可以方便的创建、销毁容器。

docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。

程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了

71PH`G5JHR@YE3GJVW28)RR.png

核心概念

镜像,容器,仓库
image.png

镜像images

Docker镜像是用于创建Docker容器的模板

容器Container

容器是独立运行的一个或一组应用

启动、停止、删除。

仓库Registy

Docker仓库用来保存镜像

  • 公有仓库
  • 私有仓库

可以做什么

虚拟机技术

  • 资源占用
  • 冗余步骤
  • 启动慢

Docker
容器化技术

  • 传统虚拟机,虚拟一个硬件。
  • 每个容器互相隔离。每个容器都有一个自己的文件系统。互不影响

image.png

安装

image.png

image.png

下载

Download

Docker镜像https://hub.daocloud.io/

Linux

本机环境

  1. [root@linis_server ~]# uname -r
  2. 3.10.0-1062.9.1.el7.x86_64

安装

CenterOS

yum install docker

systemctl start/status docker

docker version

image.png

确认APT添加Https协议和CA证书

apt-get install apt-transport-https ca-certificates

添加新的GPG密钥

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-get install docker.io

检查是否安装成功

docker -v
>>> ocker version 18.09.1, build 4c52b90

开始 - 图9

Usage:
docker [OPTIONS] COMMAND

A self-sufficient runtime for containers.

Options:
  --config=~/.docker              Location of client config files  #客户端配置文件的位置

  -D, --debug=false               Enable debug mode  #启用Debug调试模式

  -H, --host=[]                   Daemon socket(s) to connect to  #守护进程的套接字(Socket)连接

  -h, --help=false                Print usage  #打印使用

  -l, --log-level=info            Set the logging level  #设置日志级别

  --tls=false                     Use TLS; implied by--tlsverify  #

  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA  #信任证书签名CA

  --tlscert=~/.docker/cert.pem    Path to TLS certificate file  #TLS证书文件路径

  --tlskey=~/.docker/key.pem      Path to TLS key file  #TLS密钥文件路径

  --tlsverify=false               Use TLS and verify the remote  #使用TLS验证远程

  -v, --version=false             Print version information and quit  #打印版本信息并退出



Commands:

    attach    Attach to a running container  #当前shell下attach连接指定运行镜像

    build     Build an image from a Dockerfile  #通过Dockerfile定制镜像

    commit    Create a new image from a container's changes  #提交当前容器为新的镜像

    cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中

    create    Create a new container  #创建一个新的容器,同run 但不启动容器

    diff    Inspect changes on a container's filesystem  #查看docker容器变化

    events    Get real time events from the server#从docker服务获取容器实时事件

    exec    Run a command in a running container#在已存在的容器上运行命令

    export    Export a container's filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)

    history    Show the history of an image  #展示一个镜像形成历史

    images    List images  #列出系统当前镜像

    import    Import the contents from a tarball to create a filesystem image  #从tar包中的内容创建一个新的文件系统映像(对应export)

    info    Display system-wide information  #显示系统相关信息

    inspect    Return low-level information on a container or image  #查看容器详细信息

    kill    Kill a running container  #kill指定docker容器

    load    Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)

    login    Register or log in to a Docker registry#注册或者登陆一个docker源服务器

    logout    Log out from a Docker registry  #从当前Docker registry退出

    logs    Fetch the logs of a container  #输出当前容器日志信息

    pause    Pause all processes within a container#暂停容器

    port    List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口

    ps    List containers  #列出容器列表

    pull    Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像

    push    Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器

    rename    Rename a container  #重命名容器

    restart    Restart a running container  #重启运行的容器

    rm    Remove one or more containers  #移除一个或者多个容器

    rmi    Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)

    run    Run a command in a new container  #创建一个新的容器并运行一个命令

    save    Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)

    search    Search the Docker Hub for images  #在docker
hub中搜索镜像

    start    Start one or more stopped containers#启动容器

    stats    Display a live stream of container(s) resource usage statistics  #统计容器使用资源

    stop    Stop a running container  #停止容器

    tag         Tag an image into a repository  #给源中镜像打标签

    top       Display the running processes of a container #查看容器中运行的进程信息

    unpause    Unpause all processes within a container  #取消暂停容器

    version    Show the Docker version information#查看容器版本号

    wait         Block until a container stops, then print its exit code  #截取容器停止时的退出状态值
镜像操作:from a Dockerfile
    commit    Create a new image from a container's changes
    images    List images
    load      Load an image from a tar archive or STDIN
    pull      Pull an image or a repository from a registry
    push      Push an image or a repository to a registry
    rmi       Remove one or more images
    search    Search the Docker Hub for images
    tag       Tag an image into a repository
    save      Save one or more images to a tar archive 
    history   显示某镜像的历史
    inspect   获取镜像的详细信息

    容器及其中应用的生命周期操作:
    create    创建一个容器
    kill      Kill one or more running containers
    inspect   Return low-level information on a container, image or task
    pause     Pause all processes within one or more containers
    ps        List containers
    rm        删除一个或者多个容器
    rename    Rename a container
    restart   Restart a container
    run       创建并启动一个容器
    start     启动一个处于停止状态的容器
    stats     显示容器实时的资源消耗信息
    stop      停止一个处于运行状态的容器
    top       Display the running processes of a container
    unpause   Unpause all processes within one or more containers
    update    Update configuration of one or more containers
    wait      Block until a container stops, then print its exit code
    attach    Attach to a running container
    exec      Run a command in a running container
    port      List port mappings or a specific mapping for the container
    logs      获取容器的日志

    容器文件系统操作:
    cp        Copy files/folders between a container and the local filesystem
    diff      Inspect changes on a container's filesystem
    export    Export a container's filesystem as a tar archive
    import    Import the contents from a tarball to create a filesystem image

    Docker registry 操作:
    login     Log in to a Docker registry.
    logout    Log out from a Docker registry.

    Volume 操作
    volume    Manage Docker volumes

    网络操作
    network   Manage Docker networks

    Swarm 相关操作
    swarm     Manage Docker Swarm
    service   Manage Docker services
    node      Manage Docker Swarm nodes

    系统操作:
    version   Show the Docker version information
    events    持续返回docker 事件
    info      显示Docker 主机系统范围内的信息

启动|停止

service docker start
service docker stop
service docker status
chkconfig docker on #设置开机启动
docker run hello-world

开始 - 图10

升级|卸载

sudo apt-get upgrade 

sudo apt-get purge docker.io*
sudo groupadd docker #添加docker用户组

sudo gpasswd -a $USER docker #将登录用户加入到docker用户组

newgrp docker #更新 用户组

docker ps #测试
# 镜像加速
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

测试HelloWorld

docker run hello-world

image.png

Mac

https://www.docker.com/get-started
image.png

Centos

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

镜像

https://hub.docker.com/

镜像是一个只读的文件和文件夹组合,是Docker容器启动的先觉条件。

它包含了容器运行时所需要的所有基础文件和配置信息,是容器启动的基础。所以你想启动一个容器,那首先必须要有一个镜像。镜像是 Docker 容器启动的先决条件。

使用镜像

如果你想要使用一个镜像,你可以用这两种方式:

自己创建镜像。通常情况下,一个镜像是基于一个基础镜像构建的,你可以在基础镜像上添加一些用户自定义的内容。例如你可以基于centos镜像制作你自己的业务镜像,首先安装nginx服务,然后部署你的应用程序,最后做一些自定义配置,这样一个业务镜像就做好了。

从功能镜像仓库拉取别人制作好的镜像。一些常用的软件或者系统都会有官方已经制作好的镜像,例如nginx、ubuntu、centos、mysql等,你可以到https://hub.docker.com/ 搜索并下载它们。

image.png

搜索镜像

[root@linis_server ~]# docker search mysql

NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9553                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3471                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   700                                     [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   76                                      
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   69                                      
centurylink/mysql                 Image containing mysql. Optimized to be link…   61                                      [OK]
...

下载镜像

docker pull 拉取远程仓库的镜像到本地

命令格式一般为 docker pull [Registry]/[Repository]/[Image]:[Tag]。

Registry 为注册服务器,Docker 默认会从 docker.io 拉取镜像,如果你有自己的镜像仓库,可以把 Registry 替换为自己的注册服务器。

Repository 为镜像仓库,通常把一组相关联的镜像归为一个镜像仓库,library为 Docker 默认的镜像仓库。

Image 为镜像名称。

Tag 为镜像的标签,如果你不指定拉取镜像的标签,默认为latest。

docker pull 镜像名[:标签]
docker pull mysql

# Or

docker pull mysql:latest
# 下载指定版本
docker pull mysql:5.7

列出下载的镜像

docker images

kali# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/library/mysql   latest              c7109f74d339        8 days ago          443MB
hello-world                 latest              fce289e99eb9        5 months ago        1.84kB

REPOSITORY 镜像的仓库源头
TAG 镜像的标签
IMAGE ID 镜像的ID
created 镜像的创建时间
size 镜像的大小

删除镜像

  • 通过id来删除
docker rmi 镜像ID

查看镜像信息

[root@linis_server ~]# docker image inspect 9a059cab6849

开始 - 图14

重命名镜像

docker tag

docker tag [SOURCE_IMAGE][:TAG] [TARGET_IMAGE][:TAG]

手动构建镜像

第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;

第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。

容器

容器就像一个类的实例

容器是什么呢?容器是 Docker 的另一个核心概念。通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。

虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。

image.png

启动容器

docker run --help

docker run命令直接基于镜像新建一个容器并启动,相当于
先执行docker create命令从镜像创建容器,然后再执行docker start命令启动容器

docker run <选项参数> <镜像名称> <运行的文件>


-i -t 让容器的标准输入保持打开 让Docker分配一个伪终端,并绑定到容器的标准输入上
-d 后台运行
--name='Name' 指定容器的名称 如果不指定会随机的名称进行指定,用来区分容器
-p 端口映射,将主机的端口映射到容器的一个端口 主机端口:内部容器
 - 主机端口:容器端口
 - 容器端口
-c 运行一段shell命令

kali# docker run -d -p 8888:8080 tomcat
771845e1556a72d06614af22e03586f70f288c2349fbd11b18608e5d9c945b16

开始 - 图16

查看容器列表

docker ps  #查看运行中的容器

-a      #列出所有容器包括停止的
-f      #根据条件过滤显示内容
-l      #列出最近创建的容器
-n      #列出最近创建的N个容器,N为数字
-q      #只显示容器ID
-s      #显示总文件大小

kali# docker ps                          
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS               NAMES
38a27b6fcfd6        tomcat:8.5-jre8-slim   "catalina.sh run"   2 minutes ago       Up 2 minutes        8080/tcp            mtomcat

启动并且进入容器

docker exec -it [ID] bash
# 退出环境
exit
# 容器不停止退出
Ctrl+P+Q

停止容器

docker stop 容器ID

kali# docker stop 38a27b6fcfd6
38a27b6fcfd6

启动容器

docker start

kali# docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                     PORTS               NAMES
38a27b6fcfd6        tomcat:8.5-jre8-slim   "catalina.sh run"   15 hours ago        Exited (255) 2 hours ago   8080/tcp            mtomcat
ed24dd3bd2b1        hello-world            "/hello"            19 hours ago        Exited (0) 19 hours ago                        boring_rosalind
kali# docker start 38a27b6fcfd6
38a27b6fcfd6
kali# docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS               NAMES
38a27b6fcfd6        tomcat:8.5-jre8-slim   "catalina.sh run"   16 hours ago        Up 3 seconds        8080/tcp            mtomcat

删除容器

docker rm 容器ID

进入容器

容器通常都是后台方式运行的。需要进入容器。修改一些配置。

docker exec -it [ID]

docker run与start的区别

docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start

docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)

docker start的作用是,重新启动已存在的镜像

所以通过docker rename newName oldName来为容器重新命名

第二个方式

进入容器正在执行的终端。不会启动新的进程。

docker attach  [id]

日志,元数据,进程的查看

容器日志

docker logs 容器ID

开始 - 图17

元数据

查看容器元数据

docker inspect [容器Id]

从容器内拷贝到主机上

docker cp id:路径 主机路径

#比如
docker cp 233:/home/main.js .

查看Docker容器进程信息

docker top [容器id]

导出容器

docker export CONTAINER 命令导出一个容器到文件,不管此时该容器是否处于运行中的状态。

docker export busybox > busybox.tar

执行以上命令后会在当前文件夹下生成 busybox.tar 文件,我们可以将该文件拷贝到其他机器上,通过导入命令实现容器的迁移。

image.png

通过docker export命令导出的文件,可以使用docker import命令导入,执行完docker import后会变为本地镜像,最后再使用docker run命令启动该镜像,这样我们就实现了容器的迁移。

docker import [OPTIONS] file|URL [REPOSITORY[:TAG]]

仓库

Docker 的镜像仓库类似于代码仓库,用来存储和分发 Docker 镜像。镜像仓库分为公共镜像仓库和私有镜像仓库。

目前,Docker Hub 是 Docker 官方的公开镜像仓库,它不仅有很多应用或者操作系统的官方镜像,还有很多组织或者个人开发的镜像供我们免费存放、下载、研究和使用。除了公开镜像仓库,你也可以构建自己的私有镜像仓库

其他

部署MySQL

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io #配置加速器

docker search mysql 

docker pull mysql #下载安装

docker images # 查看是否安装成功|拥有

docker run --name imysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql #端口映射

开始 - 图19

使用自定义MySQL配置文件

默认以/etc/mysql/my.cnf为配置文件

创建自己的配置文件目录 /my/mysql/config.cnf

docker run --name imysql2 -v /my/mysql/config.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=1234 -d mysql

部署Nginx

  1. 下载Nginx镜像
kali# docker pull daocloud.io/library/nginx:1.13.0-alpine
1.13.0-alpine: Pulling from library/nginx
b2388ca7fa65: Pull complete 
7947be538089: Pull complete 
d16f692df913: Pull complete 
0dbd6ee41762: Pull complete 
Digest: sha256:5c36f962c506c379bd63884976489c9c5e700c1496a6e8ea13dc404b1d258f76
Status: Downloaded newer image for daocloud.io/library/nginx:1.13.0-alpine
  1. 启动
docker run --name my-nginx -d -p 8080:80 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]

部署单机Redis

docker pull redis

docker run -it -d --name myredis -p 6379:6379 redis 41de2cc0b30e

参考

官网

image.png

https://github.com/jaywcjlove/docker-tutorial

问题

容器和镜像的区别?

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

image.png

镜像包含了容器运行所需要的文件系统结构和内容,是静态的只读文件,而容器则是在镜像的只读层上创建了可写层,并且容器中的进程属于运行状态,容器是真正的应用载体。

容器的生命周期

容器的生命周期是容器可能处于的状态,容器的生命周期分为 5 种。

created:初建状态

running:运行状态

stopped:停止状态

paused: 暂停状态

deleted:删除状态

image.png

总结

IMG_0875.JPGIMG_0874.JPGIMG_0873.JPG