windghoul / ContainerCamp

2 stars 1 forks source link

Hello Docker World #2

Closed mlycore closed 6 years ago

mlycore commented 6 years ago

在了解对云计算和容器的历史后,大家应该都安耐不住要动手了。

那么这次的问题是:

补充说明 如果有条件的话尽量在Linux的机器上进行实验

LinkinPF commented 6 years ago

说明:写文档时是在本地写的,但直接粘贴到这里不能识别,GitHub支持显示网页的图片,我就把用到的截图放到自己的github主页里,然后下面每一个小图片点击之后可以跳转到主页查看。

1、安装

1、注册docker community的账号,用户名:linkinp

2、下载安装

image.png

3、检查安装的docker的版本:2

也可以检测出来docker的版本

4、该进行docker version命令,但是发生了错误,这里的错误在查过后发现是因为没有翻墙造成的,那么就要给mac翻墙,天哪噜,GitHub上的方案:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/3-macos-setup-guide-cn.md

5、在翻过墙之后,再输入docker version命令,显示如下:3

6、接下来执行docker info命令也正确执行了。

7、先说几个docker的命令:

$ docker ps -a         
用来显示容器名称和映像,和其他信息,具体如下:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES

182206e6837f        nginx               "nginx -g 'daemon of…"   3 hours ago         Up About a minute   0.0.0.0:80->80/tcp   webserver
$ docker run -d -p 80:80 --name webserver nginx       用来加载nginx服务器
$ docker stop webserver
$ docker rm webserver
                               用来停止nginx服务器并删除 

7、尝试运行一个nginx服务器:

4

服务器运行后,可以访问 http://localhost,看到如下界面5

之后停止服务器并删除。

8、安装镜像加速器:

macOS 下,在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址 https://registry.docker-cn.com。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

2、获取镜像

GitHub上有大量的开源项目,对应到docker下,就有Docker Hub,这上面有大量的高质量的镜像可以使用。

获取镜像的命令:

$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

开始获取镜像:6

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

这里的速度还是很快的,原因是前面设置了镜像加速器,如果没有镜像加速器,那么就会下载很慢。

3、使用镜像

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的ubuntu:16.04 为例,启动里面的 bash (linux默认的shell)并且进行交互式操作的话,可以执行下面的命令,并且可以看出来当前ubuntu的版本,之后使用exit来退出镜像。7

docker run 就是运行容器的命令,说明一下上面用到的参数。

最后,实际使用到的命令就是:

$docker run -it --rm ubuntu:16.04 bash

进入容器后,可以在 Shell 下操作,执行任何所需的命令,这里执行了 uname -r

最后通过exit来退出容器:

$exit

4、列出已经下载下来的镜像

使用 docker image ls 命令来查看:

8

列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签

使用docker system df来查看镜像,容器数据卷所占用的空间9

5、删除本地镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

前面已经使用了docker image ls命令来查看了镜像的名字

10

可以用镜像的完整 ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。

也就是说,假如说要删除ubuntu镜像,那么就可以使用下面的命令:

$ docker image rm b9e

也可以使用镜像名,也就是 <仓库名>:<标签>,来删除镜像。

$ docker image rm ubuntu
Untagged:ubuntu:16.04

回过头来看一些基本概念

1、docker镜像-分层存储

什么是docker镜像,从前面找,从docker hub上pull下来的ubuntu:16.04就是docker镜像,它是用来干什么的?它是一个文件系统,这个文件系统提供两部分内容:

镜像不包含任何的动态数据,它的内容在构建之后不会发生改变,自己感觉有点像程序和进程的概念。

docker这个镜像,实际上不是由一个个文件组成的,是由多层文件系统联合组成,它使用了Union FS技术(wiki),docker镜像我们自己是可以构建的,它在构建的时候,会一层一层的构建,前一层时候一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。举个例子来说就是:删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。

2、docker容器

这里就是前面说的,有点像程序和进程的概念,镜像就像是程序,他是死的静态的,而容器就像是进程,可以被创建、启动、停止、删除、暂停。

与虚拟机混淆:

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

这里还有一些概念,但是这里还是有点看不懂,标记下,先往后看

3、docker Registry - Docker Hub

一句话来说就是:一个集中的存储、分发镜像的服务

naomiyang commented 6 years ago

1. 获取镜像

安装好Docker环境后,在终端中使用docker search nginx命令查找该镜像,然后通过docker pull nginx获取到nginx的镜像,验证是否成功获取的命令是docker images

2. 运行容器

docker run -p 8080:80 -d nginx docker run是运行容器 关于参数: -d :是让容器在后台运行,也就是作为守护进程执行。 -p:将容器内部的端口80,映射到我们的主机的8080端口。 nginx是镜像名。

3. 新建HTML文件并进行替换

本地有一个index.html文件,想要做的是:将nginx镜像的欢迎界面更改为自己的html文件。 该HTML文件为

<html>
<h1 style="color:red">Hello Docker World!!!</h1>
</html>

然后通过docker cp index.html 容器id:/usr/share/nginx/html命令修改后的页面,在关掉容器后再次打开内容又将变为更改之前的。接着通过localhost:8080可以访问到该nginx服务器的主页已经被篡改为自己的。 但是Docker在容器内所做的改变都是临时的,没有被保存的。如果添加了-commit命令,那么将会保存更改。

mlycore commented 6 years ago

说明:写文档时是在本地写的,但直接粘贴到这里不能识别,GitHub支持显示网页的图片,我就把用到的截图放到自己的github主页里,然后下面每一个小图片点击之后可以跳转到主页查看。

1、安装

1、注册docker community的账号,用户名:linkinp

2、下载安装

image.png

3、检查安装的docker的版本:2

也可以检测出来docker的版本

4、该进行docker version命令,但是发生了错误,这里的错误在查过后发现是因为没有翻墙造成的,那么就要给mac翻墙,天哪噜,GitHub上的方案:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/3-macos-setup-guide-cn.md

5、在翻过墙之后,再输入docker version命令,显示如下:3

6、接下来执行docker info命令也正确执行了。

7、先说几个docker的命令:

$ docker ps -a         
用来显示容器名称和映像,和其他信息,具体如下:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES

182206e6837f        nginx               "nginx -g 'daemon of…"   3 hours ago         Up About a minute   0.0.0.0:80->80/tcp   webserver
$ docker run -d -p 80:80 --name webserver nginx       用来加载nginx服务器
$ docker stop webserver
$ docker rm webserver
                               用来停止nginx服务器并删除 

7、尝试运行一个nginx服务器:

4

服务器运行后,可以访问 http://localhost,看到如下界面5

之后停止服务器并删除。

8、安装镜像加速器:

macOS 下,在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址 https://registry.docker-cn.com。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

2、获取镜像

GitHub上有大量的开源项目,对应到docker下,就有Docker Hub,这上面有大量的高质量的镜像可以使用。

获取镜像的命令:

$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

* Docker 镜像仓库地址:地址的格式一般是 `<域名/IP>[:端口号]`。默认地址是 Docker Hub。

* 仓库名:如之前所说,这里的仓库名是两段式名称,即 `<用户名>/<软件名>`。对于 Docker Hub,如果不给出用户名,则默认为 `library`,也就是官方镜像。

开始获取镜像:6

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜像。

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

这里的速度还是很快的,原因是前面设置了镜像加速器,如果没有镜像加速器,那么就会下载很慢。

3、使用镜像

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的ubuntu:16.04 为例,启动里面的 bash (linux默认的shell)并且进行交互式操作的话,可以执行下面的命令,并且可以看出来当前ubuntu的版本,之后使用exit来退出镜像。7

docker run 就是运行容器的命令,说明一下上面用到的参数。

* `-it`:这是两个参数,一个是 `-i`:交互式操作,一个是 `-t` 终端。我们这里打算进入 `bash` 执行一些命令并查看返回结果,因此我们需要交互式终端。

* `--rm`:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 `docker rm`。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 `--rm` 可以避免浪费空间。

* `ubuntu:16.04`:这是指用 `ubuntu:16.04` 镜像为基础来启动容器。

* `bash`:放在镜像名后的是**命令**,这里我们希望有个交互式 Shell,因此用的是 `bash`。

最后,实际使用到的命令就是:

$docker run -it --rm ubuntu:16.04 bash

进入容器后,可以在 Shell 下操作,执行任何所需的命令,这里执行了 uname -r

最后通过exit来退出容器:

$exit

4、列出已经下载下来的镜像

使用 docker image ls 命令来查看:

8

列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签

使用docker system df来查看镜像,容器数据卷所占用的空间9

5、删除本地镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

前面已经使用了docker image ls命令来查看了镜像的名字

10

可以用镜像的完整 ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。

也就是说,假如说要删除ubuntu镜像,那么就可以使用下面的命令:

$ docker image rm b9e

也可以使用镜像名,也就是 <仓库名>:<标签>,来删除镜像。

$ docker image rm ubuntu
Untagged:ubuntu:16.04

回过头来看一些基本概念

1、docker镜像-分层存储

什么是docker镜像,从前面找,从docker hub上pull下来的ubuntu:16.04就是docker镜像,它是用来干什么的?它是一个文件系统,这个文件系统提供两部分内容:

* 容器运行时所需的程序、库、资源、配置等文件

* 为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

镜像不包含任何的动态数据,它的内容在构建之后不会发生改变,自己感觉有点像程序和进程的概念。

docker这个镜像,实际上不是由一个个文件组成的,是由多层文件系统联合组成,它使用了Union FS技术(wiki),docker镜像我们自己是可以构建的,它在构建的时候,会一层一层的构建,前一层时候一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。举个例子来说就是:删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。

2、docker容器

这里就是前面说的,有点像程序和进程的概念,镜像就像是程序,他是死的静态的,而容器就像是进程,可以被创建、启动、停止、删除、暂停。

与虚拟机混淆:

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

这里还有一些概念,但是这里还是有点看不懂,标记下,先往后看

3、docker Registry - Docker Hub

一句话来说就是:一个集中的存储、分发镜像的服务

* 官方免费的公共服务
  registry的意思是登记,一个 Docker Registry 中可以包含多个**仓库**(`Repository`);每个仓库可以包含多个**标签**(`Tag`);每个标签对应一个镜像。
  **捋一下,先登记 ->  多个仓库  -> 每个仓库多个标签 -> 每个标签一个镜像**
  ```
  **Docker Hub ->repository ->              tag             -> image**
  ```
  例如,ubuntu是一个仓库,14.04和16.04是它的标签,对应的ubuntu:14.04和ubuntu:16.04是具体的镜像。
  Docker Hub是默认的Registry,它是官方的,亲儿子,有很多的高质量的镜像,在前面配置了加速器,就是为了从Docker Hub上下载镜像的时候快一点。

* 本地搭建私有Docker Registry
  docker官方提供了Docker Registry镜像,可以直接使用作为私有Registry服务,这里没有实际使用过,实际使用过之后再说。
  1. 第一个回答问题的速度max 赞!
  2. 为了大家阅读方便你可以考虑重新排个版,要贴出来的图片直接使用markdown格式展示就可以了,不能让别人再专门跳一次,因为我们写东西要考虑到读者的体验。
  3. [2 Docker容器] 部分里上文写的是“与虚拟机混淆”,下文却说了”与宿主机上的进程的区别“,逻辑不太对应
  4. 剧透一下,本地搭建自己的安全仓库可能是后面的大作业 /手动滑稽
mlycore commented 6 years ago

1. 获取镜像

安装好Docker环境后,在终端中使用docker search nginx命令查找该镜像,然后通过docker pull nginx获取到nginx的镜像,验证是否成功获取的命令是docker images

2. 运行容器

docker run -p 8080:80 -d nginx docker run是运行容器 关于参数: -d :是让容器在后台运行,也就是作为守护进程执行。 -p:将容器内部的端口80,映射到我们的主机的8080端口。 nginx是镜像名。

3. 新建HTML文件并进行替换

本地有一个index.html文件,想要做的是:将nginx镜像的欢迎界面更改为自己的html文件。 该HTML文件为

<html>
<h1 style="color:red">Hello Docker World!!!</h1>
</html>

然后通过docker cp index.html 容器id:/usr/share/nginx/html命令修改后的页面,在关掉容器后再次打开内容又将变为更改之前的。接着通过localhost:8080可以访问到该nginx服务器的主页已经被篡改为自己的。 但是Docker在容器内所做的改变都是临时的,没有被保存的。如果添加了-commit命令,那么将会保存更改。

* `docker commit -m 'fun' 容器id`  这样就产生了新的image,但是是无名的。

* `docker commit -m 'fun' 容器id nginx_hello`,nginx_hello就是新image的名字

回答问题思路很清晰点赞!使用到了docker cp命令点赞!

  1. 思考一下除了docker cp还能怎么修改index.html?
  2. 可以对涉及到的docker search、docker pull、docker run、docker cp等命令作进一步实验,反馈各个参数测试结果。
naomiyang commented 6 years ago

1.获取镜像

安装好多克尔环境后,终端在使用中docker search nginx命令查找该它的镜像就是,通过然后docker pull nginx电子杂志到nginx的的镜像,验证是否成功获取的命令是docker images

2.运行容器

docker run -p 8080:80 -d nginx docker run是运行容器 关于参数: -d:是让容器在后台运行,也就是作为守护进程执行。 -p:将容器内部的端口80,映射到我们的主机的8080端口 .nginx是镜像名。

3.新建HTML文件并进行替换

本地有一个index.html的文件,想要做的是:将nginx的镜像的欢迎界面更改为自己的HTML文件 该HTML文件为

<html>
<h1 style="color:red">Hello Docker World!!!</h1>
</html>

通过然后docker cp index.html 容器id:/usr/share/nginx/html命令修改后的页面,在关掉容器后再次打开内容又将变为更改之前的接着通过本地主机:8080可以访问到该nginx的的服务器主页已经被篡改为自己的 但是码头工人在容器内所做的改变都是临时的,没有被保存的。如果添加了-commit命令,那么将会保存更改。

* `docker commit -m 'fun' 容器id`  这样就产生了新的image,但是是无名的。

* `docker commit -m 'fun' 容器id nginx_hello`,nginx_hello就是新image的名字

回答问题思路很清晰点赞!使用到了docker cp命令点赞!

  1. 思考一下除了docker cp还能怎么修改index.html?
  2. 可以对涉及到的docker search,docker pull,docker run,docker cp等命令作进一步实验,反馈各个参数测试结果。

更改html的第二种方法

1. 首先创建一个名为d1的文件夹 进入该文件夹后再创建一个Dockerfile文件,如下所示:

FROM ubuntu
MAINTAINER yang225217
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

在Dockerfile文件的同级下准备一个index.html。 from是基础镜像,maintainer是作者, sed是用来对镜像的加速,apt-get install -y nginx是安装nginx,参数-y是让其不要询问,entrypoint["/usr/sbin/nginx","-g","daemon off;"]是不以守护进程启动nginx,即作为前台执行。 2. 构建 docker build -t yang225217/nginx . .是当前的所有文件 3. 运行 docker run -d -p 8080:80 yang225217/nginx 然后通过localhost:8080就可以看到修改的html页面。

zyy-yan commented 6 years ago
1.安装Docker环境

根据Google搜索安装Docker环境,设置好相关配置,验证Docker是否安装成功。

使用docker run hello-world命令来来确认是否正确安装,该命令会下载一个测试镜像然后开启一个容器运行。当容器运行之后会输出一段”hello from Docker!"消息然后退出

2.获取镜像

安装好Docker环境之后,查找镜像:

docker search nginx

获取镜像:

docker pull nginx

验证是否成功获取到镜像:

docker images

3.运行容器

docker run -p 8080:80 -d nginx

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

OPTIONS说明:

4.查看容器的运行情况

docker ps 这条命令用来列出容器的信息

5.通过浏览器访问

现在通过浏览器访问localhost:8080可以得到“Welcome to nginx! ”

mlycore commented 6 years ago

1.获取镜像

安装好多克尔环境后,终端在使用中docker search nginx命令查找该它的镜像就是,通过然后docker pull nginx电子杂志到nginx的的镜像,验证是否成功获取的命令是docker images

2.运行容器

docker run -p 8080:80 -d nginx docker run是运行容器 关于参数: -d:是让容器在后台运行,也就是作为守护进程执行。 -p:将容器内部的端口80,映射到我们的主机的8080端口 .nginx是镜像名。

3.新建HTML文件并进行替换

本地有一个index.html的文件,想要做的是:将nginx的镜像的欢迎界面更改为自己的HTML文件 该HTML文件为

<html>
<h1 style="color:red">Hello Docker World!!!</h1>
</html>

通过然后docker cp index.html 容器id:/usr/share/nginx/html命令修改后的页面,在关掉容器后再次打开内容又将变为更改之前的接着通过本地主机:8080可以访问到该nginx的的服务器主页已经被篡改为自己的 但是码头工人在容器内所做的改变都是临时的,没有被保存的。如果添加了-commit命令,那么将会保存更改。

* `docker commit -m 'fun' 容器id`  这样就产生了新的image,但是是无名的。

* `docker commit -m 'fun' 容器id nginx_hello`,nginx_hello就是新image的名字

回答问题思路很清晰点赞!使用到了docker cp命令点赞!

  1. 思考一下除了docker cp还能怎么修改index.html?
  2. 可以对涉及到的docker search,docker pull,docker run,docker cp等命令作进一步实验,反馈各个参数测试结果。

更改html的第二种方法

1. 首先创建一个名为d1的文件夹 进入该文件夹后再创建一个Dockerfile文件,如下所示:

FROM ubuntu
MAINTAINER yang225217
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

在Dockerfile文件的同级下准备一个index.html。 from是基础镜像,maintainer是作者, sed是用来对镜像的加速,apt-get install -y nginx是安装nginx,参数-y是让其不要询问,entrypoint["/usr/sbin/nginx","-g","daemon off;"]是不以守护进程启动nginx,即作为前台执行。 2. 构建 docker build -t yang225217/nginx . .是当前的所有文件 3. 运行 docker run -d -p 8080:80 yang225217/nginx 然后通过localhost:8080就可以看到修改的html页面。

这是个很彻底的办法,但是我们不会每次改变index.html就都重新打一次镜像。那你有没有试过docker exec ? 😏

mlycore commented 6 years ago
1.安装Docker环境

根据Google搜索安装Docker环境,设置好相关配置,验证Docker是否安装成功。

使用docker run hello-world命令来来确认是否正确安装,该命令会下载一个测试镜像然后开启一个容器运行。当容器运行之后会输出一段”hello from Docker!"消息然后退出

2.获取镜像

安装好Docker环境之后,查找镜像:

docker search nginx

获取镜像:

docker pull nginx

验证是否成功获取到镜像:

docker images

3.运行容器

docker run -p 8080:80 -d nginx

* `-p 8080:80` : 将nginx容器的80端口映射到主机的8080端口

* -d :让容器在后台运行,并返回容器ID

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

OPTIONS说明:

* **-a stdin:** 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

* **d:** 后台运行容器,并返回容器ID;

* **-i:** 以交互模式运行容器,通常与 -t 同时使用;

* **-p:** 端口映射,格式为:主机(宿主)端口:容器端口

* **-t:** 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 等等……

* **--name="nginx-lb":** 为容器指定一个名称;

* **--dns 8.8.8.8:** 指定容器使用的DNS服务器,默认和宿主一致;

* **--dns-search example.com:** 指定容器DNS搜索域名,默认和宿主一致;

* **-h "mars":** 指定容器的hostname;

* **-e username="ritchie":** 设置环境变量;

* **--env-file=[]:** 从指定文件读入环境变量;

* **--cpuset="0-2" or --cpuset="0,1,2":** 绑定容器到指定CPU运行;

* **-m :**设置容器使用内存最大值;

* **--net="bridge":** 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

* **--link=[]:** 添加链接到另一个容器;

* **--expose=[]:** 开放一个端口或一组端口;
4.查看容器的运行情况

docker ps 这条命令用来列出容器的信息

* **-a :**显示所有的容器,包括未运行的。

* **-f :**根据条件过滤显示的内容。

* **--format :**指定返回值的模板文件。

* **-l :**显示最近创建的容器。

* **-n :**列出最近创建的n个容器。

* **--no-trunc :**不截断输出。

* **-q :**静默模式,只显示容器编号。

* **-s :**显示总的文件大小。
5.通过浏览器访问

现在通过浏览器访问localhost:8080可以得到“Welcome to nginx! ”

答案写的很清楚,赞!

我实际上想问的是怎么做才可以访问nginx容器,得到“Hello Docker World”的页面呢 ❓

hawl29 commented 6 years ago
mlycore commented 6 years ago
* Stop a running container by sending SIGTERM and then SIGKILL after a grace period
  docker kill
  Kill a running container using SIGKILL or a specified signal

你这里面提到了一个非常重要的概念gracefulstop即优雅停止,炒鸡赞!

拓展一下,你能简单讲讲SIGTERM和SIGKILL的异同么?

lemony3650 commented 6 years ago

docker体验

检查本地是否存在指定的镜像,不存在就从公有仓库下载,利用镜像创建并启动一个容器 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去,从地址池配置一个 ip 地址给容器 执行用户指定的应用程序,执行完毕后容器被终止

容器操作

-t:在新容器内指定一个伪终端或终端。 -d:让容器在后台运行,以守护态形式运行 -i:允许你对容器内的标准输入 (STDIN) 进行交互

donggua2333 commented 6 years ago

1 修改镜像源:

直接修改/etc/docker/daemon.json文件,如下图所示

2018-09-28 16-51-47

2 pull nginx镜像

docker pull nignx

3 构建自己的镜像

创建一个static-html-directory目录,其中放入自己的html文件 my.html,下一步开始写dockerfile创建一个新的镜像。 2018-09-28 16-57-45 这个dockerfile总共两行,第一步设置基础镜像为我们刚刚pull的nginx。然后将宿主机上的static-html-directory中的所有文件复制到容器的/usr/share/nginx/html目录中,值得注意的是该目录并不会被拷贝到dst目录中。

COPY命令有两个参数第一个参数 src 是宿主机中的拷贝源路径,dst是容器中的目的路径。dockerfile写完之后,使用docker build命令构建镜像。

在构建镜像时会出现如下错误, 这是因为使用docker build命令必须要制定一个上下文。这个上下文就是在构建镜像时所需要的一系列文件,比如在使用COPY命令时需要拷贝到容器的源文件。这个上下文可以使用路径指定或者URL来指定。

2018-09-28 17-36-50

2018-09-28 14-20-49

当我们指定上下文来自 "." 时,可以看到镜像可以正常构建。镜像名为a_new_nginx,该镜像内的html就是我们自己写的html。

2018-09-28 17-23-30

4. 运行容器

接下来我们就可以运行自己创建的镜像,我们需要把容器内nginx使用的80端口映射到宿主机上的8080端口。

使用docker run命令的 -p选项来设置宿主机和容器的端口映射。

2018-09-28 18-00-53

打开浏览器看到如下页面,说明我们的nginx容器就运行成功了。

2018-09-28 18-19-52

5.总结

本文中所用到的docker命令有:

docker pull:拉取镜像

docker imags:显示当前的镜像

docker build:构建镜像

docker run :运行一个容器

docker ps :显示处于运行态的容器

docker rmi, docker rm:删除镜像和容器。

参考

https://blog.csdn.net/yangzhenping/article/details/43668845 如何查看容器的IP地址和网络相关的参数?

https://hub.docker.com/_/nginx/ docker hub中的nignx主页

http://www.talkwithtrend.com/Question/153473 关于Dockerfile文件的命名

https://docs.docker.com/engine/reference/run/ 讲解docker的端口映射

https://docs.docker.com/engine/reference/commandline/build/#git-repositories docker build的文档

https://docs.docker.com/engine/reference/builder/#environment-replacement dockerfile的官方文档

https://docs.docker.com/engine/reference/commandline/run/ docker run 命令的文档

http://wiki.ubuntu.org.cn/Nginx ubuntu上nginx的配置指南

lvxiafei commented 6 years ago

安装Docker命令:

wget -qO- https://get.docker.com | sh

允许非root用户:

usermod -aG docker xxx //把xxx用户添加到docker用户组中

拉docker镜像:

docker pull nginx

查看已安装docker镜像:

docker images

启动nginx服务

docker run -p 8080:80 -d nginx

列出运行中的容器

docker ps

编辑html文件,添加Hello Docker World

vim index.html

拷贝文件:

docker cp index.html 容器id://usr/share/nginx/html

查看主页: localhost:8080

hawl29 commented 6 years ago
* Stop a running container by sending SIGTERM and then SIGKILL after a grace period
  docker kill
  Kill a running container using SIGKILL or a specified signal

你这里面提到了一个非常重要的概念gracefulstop即优雅停止,炒鸡赞!

拓展一下,你能简单讲讲SIGTERM和SIGKILL的异同么?

首先,Signal是进程间通信的一种有限的形式,通常用于Unix,类Unix和其他符合POSIX的操作系统。在发送信号时,操作系统会中断目标进程的正常执行流以传递信号。

单一Unix规范 中指定了信号的类型,这些信号被定义为<single.h>头文件中的宏常量,这些宏常量由SIG前缀跟信号助记符名称组成。

SIGTERM的宏定义:

#define SIGTERM 15 /* software termination signal from kill */

直接看注释,SIGTERM是来自kill的软件终止信号。

我们再看看SIGKILL的宏定义:

#define SIGKILL 9 /* kill (cannot be caught or ignored) */

无法被捕获或忽略的kill信号。那言下之意SIGTERM是可以被捕获或忽略的咯?

WIKI中有更详细的解释:

SIGTERM

The SIGTERM signal is sent to a process to request its termination. Unlike the SIGKILL signal, it can be caught and interpreted or ignored by the process. This allows the process to perform nice termination releasing resources and saving state if appropriate. SIGINT is nearly identical to SIGTERM.

SIGTERM给进程发送请求终止的信号,不同于SIGKILL,它可以被进程捕获并解读或者被忽略。这一机制允许进程释在适当情况下先释放资源,保存状态后再“优雅的”终结。SIGINTSIGTERM几乎相同。

SIGKILL

The SIGKILL signal is sent to a process to cause it to terminate immediately (kill). In contrast to SIGTERM and SIGINT, this signal cannot be caught or ignored, and the receiving process cannot perform any clean-up upon receiving this signal.

SIGKILL向进程发送使其立即终止的信号。与SIGINTSIGTERM不同,SIGKILL不能被捕获或者忽略,并且进程在接收到该信号时不能执行任何的清理。

mlycore commented 6 years ago
* Stop a running container by sending SIGTERM and then SIGKILL after a grace period
  docker kill
  Kill a running container using SIGKILL or a specified signal

你这里面提到了一个非常重要的概念gracefulstop即优雅停止,炒鸡赞! 拓展一下,你能简单讲讲SIGTERM和SIGKILL的异同么?

首先,Signal是进程间通信的一种有限的形式,通常用于Unix,类Unix和其他符合POSIX的操作系统。在发送信号时,操作系统会中断目标进程的正常执行流以传递信号。

单一Unix规范 中指定了信号的类型,这些信号被定义为<single.h>头文件中的宏常量,这些宏常量由SIG前缀跟信号助记符名称组成。

SIGTERM的宏定义:

#define SIGTERM 15 /* software termination signal from kill */

直接看注释,SIGTERM是来自kill的软件终止信号。

我们再看看SIGKILL的宏定义:

#define SIGKILL 9 /* kill (cannot be caught or ignored) */

无法被捕获或忽略的kill信号。那言下之意SIGTERM是可以被捕获或忽略的咯?

WIKI中有更详细的解释:

SIGTERM The SIGTERM signal is sent to a process to request its termination. Unlike the SIGKILL signal, it can be caught and interpreted or ignored by the process. This allows the process to perform nice termination releasing resources and saving state if appropriate. SIGINT is nearly identical to SIGTERM.

SIGTERM给进程发送请求终止的信号,不同于SIGKILL,它可以被进程捕获并解读或者被忽略。这一机制允许进程释在适当情况下先释放资源,保存状态后再“优雅的”终结。SIGINTSIGTERM几乎相同。

SIGKILL The SIGKILL signal is sent to a process to cause it to terminate immediately (kill). In contrast to SIGTERM and SIGINT, this signal cannot be caught or ignored, and the receiving process cannot perform any clean-up upon receiving this signal.

SIGKILL向进程发送使其立即终止的信号。与SIGINTSIGTERM不同,SIGKILL不能被捕获或者忽略,并且进程在接收到该信号时不能执行任何的清理。

感谢!我学到了!