初识 Docker

ag-0-1dm65t1f6

其实这篇文章在一年多前就起好名字了,由于以前本身对 Docker 的镜像,容器等概念比较混淆,因此一直都没有写。因为最近从新看了 Docker 的内容,也将 Docker 应用到本身写的 Python 项目 github.com/AD-feiben/q… 中,将该 Python 项目制做成一个 Docker 镜像,在使用起来很是方便,因此用这篇文章记录一下 Docker 的一些知识点,同时分享给你们。关于如何制做镜像也会在之后的文章中讲到。php

对于什么是 Docker、Docker 的历史、Docker 经过什么技术实现、以及为何要使用 Docker。这里就不在搬运了网上的文章了,直接上手学习 Docker。前端

若是对上面的内容有兴趣,能够访问 yeasy.gitbooks.io/docker_prac… 进行学习linux

1、安装

由于个人是 Mac,这里只讲 Mac 的安装,其余系统的安装能够参考 yeasy.gitbooks.io/docker_prac…nginx

1.1 使用 Homebrew 安装

$ brew cask install docker
复制代码

使用 brew cask 安装便可git

1.2 手动下载安装

  1. 首先在 Docker 官网 www.docker.com 注册一个帐号,登陆帐号github

  2. 进入 hub.docker.com/?overlay=on… 下载安装便可web

下载

下载完成以后双加 .dmg 文件,将应用拖到 Application 文件夹中便可。安装完成后,在状态栏就能够看到 Docker 的 logo,说明安装成功。能够经过 docker --version 命令查看 Docker 的版本。docker

$ docker --version
Docker version 19.03.2, build 6a30dfc
复制代码

2、Docker 的一些概念

https://user-gold-cdn.xitu.io/2019/10/7/16da661eef3572d0?w=1067&h=811&f=png&s=90020

镜像存放在镜像仓库中,Docker 官方也提供了镜像仓库 hub.docker.com/ ,咱们能够从这里下载咱们所须要的镜像,固然也能够将咱们制做好的镜像存放到仓库中。当咱们下载好镜像以后,咱们能够经过 run 命令来建立对应的容器,一个镜像能够建立多个容器,每一个容器,相互之间不会产生影响。shell

2.1 image 镜像

如下镜像的操做均以 Nginx 镜像为例centos

2.1.1 搜索镜像

$ docker search nginx
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                             Official build of Nginx.                        12022               [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1669                                    [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   742                                     [OK]
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   77
bitnami/nginx                     Bitnami nginx Docker Image                      71                                      [OK]
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   55                                      [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   28                                      [OK]
jlesage/nginx-proxy-manager       Docker container for Nginx Proxy Manager        24                                      [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   23
nginx/nginx-ingress               NGINX Ingress Controller for Kubernetes         22
复制代码

能够看到 镜像名 镜像描述 点赞数 是否为官方镜像 是否为自动生成

2.1.2 下载镜像

利用 docker pull 镜像名[:版本] 下载咱们须要的镜像,不输入版本号默认为 latest

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
复制代码

2.1.3 列出本地镜像

可使用 docker image ls 或者 docker images 来列出本地存在的镜像

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              f949e7d76d63        8 days ago          126MB
centos              latest              67fa590cfc1c        6 weeks ago         202MB
复制代码

其中 REPOSITORY 为镜像名;TAG 为镜像标签;IMAGE ID 为镜像id;CREATED 为镜像建立时间;SIZE 为镜像大小,该大小为解压缩后的大小,通常比仓库中的现实的镜像大小(压缩后的大小,便于传输)要大一些。

2.1.4 删除镜像

经过 docker image rm 镜像名/镜像id 或者 docker rmi 镜像名/镜像id 来删除指定的镜像

  • 删除镜像时,须要该镜像没有被使用,不然将会看到相似下面的错误提示
$ docker rmi nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container b36481b353d3 is using its referenced image f949e7d76d63
复制代码

在 Docker 仓库中还有不少优秀的镜像,例如 Ubuntu、CentOS、MySQL 等,你们能够自行查找。

2.2 container 容器

2.2.1建立容器

咱们可使用 docker run [选项] 镜像 来建立一个容器,若是镜像在本地不存在,则会先到镜像仓库下载该镜像。下面的例子是 nginx 镜像不存在的状况。

$ docker run -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1
Status: Downloaded newer image for nginx:latest
# 终端处于监听容器日志的状态
复制代码
  • -p 参数将容器中的 80 端口映射到宿主机中的 8080 端口

在浏览器打开 localhost:8080 就能够看到熟悉的 nginx 欢迎页面了。退出容器可使用 Ctrl + C

https://user-gold-cdn.xitu.io/2019/10/7/16da661f11ea5720?w=1200&h=520&f=jpeg&s=83078

2.2.2 查看运行中的容器

咱们可使用 docker ps 或者 docker container ls 查看运行中的容器。

上一步骤经过 Ctrl + C 中止了容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
复制代码

能够看到并无运行中的容器,咱们能够加上 -a 显示全部容器,包括中止状态的容器

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a2d6842faeb5        nginx               "nginx -g 'daemon of…"   2 hours ago         Exited (0) 2 minutes ago                       crazy_northcutt
复制代码

加上 -a 后咱们就能够看到已经处于中止状态的容器。

下一步经过下面命令启动一个新的容器

$ docker run -dit -p 8080:80 nginx
b36481b353d30976171cf7c706f4ce4890f81ee1a81c7e526799fb12198e7f23
复制代码
  • -dit 参数也能够分开写为 -d -i -t

  • -d 参数表示容器在后台运行,并不会像上个例子处于监听容器日志的状态

  • -i 参数表示让容器的标准输入保持打开

  • -t 参数表示让 Docker 分配一个伪终端

能够看到此次的结果并不像 docker run -p 8080:80 nginx 那样,处于监听日志的状态。而是返回一个容器id后,终端又恢复到正常状态。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
b36481b353d3        nginx               "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes               0.0.0.0:8080->80/tcp   recursing_khayyam
a2d6842faeb5        nginx               "nginx -g 'daemon of…"   2 hours ago         Exited (0) 15 minutes ago                          crazy_northcutt
复制代码

经过 docker ps -a 命令能够看到,docker 存在两个容器。从这个例子咱们能够知道,同一个镜像,若是使用 run 命令建立容器,那么每一个容器都是不一样的实例。

2.2.3 中止容器

若是容器处在后台运行,咱们能够经过 docker ps 或者 docker container ls 将运行中的容器实例获取到,而后经过 docker container stop 容器id/容器名 中止指定容器。

$ docker container stop b36481b353d3
# b36481b353d3 为第二个容器例子,后台运行的容器
复制代码

2.2.4 启动容器

固然容器也是能够从新启动的,不须要每次建立。经过 docker container start 容器id 便可从新启动

$ docker container start b36481b353d3
复制代码
  • 经过 start 命令启动的容器都会在后台运行。

2.2.5 进入容器内

经过 docker exec -it 容器id /bin/bash 命令进入容器内,经过 -it 参数打开容器的交互式终端

docker exec -it b36481b353d3 /bin/bash
root@b36481b353d3:/#
复制代码

咱们能够在此修改容器内的东西,修改完后经过 exit 退出容器,经过 exec 命令进入容器,退出后容器仍处于运行的状态。

2.2.6 删除容器

经过 docker container rm 容器id 删除指定容器。用该方法只能删除一个容器,若是咱们想要删除多个容器,能够用空格隔开容器id。若是想删除的容器很是多,可使用 docker container prune 删除全部处于中止状态的容器。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
a2d6842faeb5cf039420edd684714134c52ca683aefc53a3934792251310ed1d

Total reclaimed space: 0B
复制代码
  • 删除容器时,容器须要处于中止状态。咱们能够经过 docker ps -a 查看中止状态的容器

2.3 repository 仓库

因为篇幅问题,有关仓库的内容将会放到下一篇文章中。


若是你喜欢个人文章,但愿能够关注一下个人公众号【前端develop】

前端develop
相关文章
相关标签/搜索