Closed mlycore closed 6 years ago
说明:写文档时是在本地写的,但直接粘贴到这里不能识别,GitHub支持显示网页的图片,我就把用到的截图放到自己的github主页里,然后下面每一个小图片点击之后可以跳转到主页查看。
1、注册docker community的账号,用户名:linkinp
2、下载安装
3、检查安装的docker的版本:
也可以检测出来docker的版本
4、该进行docker version命令,但是发生了错误,这里的错误在查过后发现是因为没有翻墙造成的,那么就要给mac翻墙,天哪噜,GitHub上的方案:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/3-macos-setup-guide-cn.md
5、在翻过墙之后,再输入docker version命令,显示如下:
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服务器:
服务器运行后,可以访问 http://localhost,看到如下界面
之后停止服务器并删除。
8、安装镜像加速器:
macOS 下,在任务栏点击 Docker for mac 应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中填写加速器地址 https://registry.docker-cn.com
。修改完成之后,点击 Apply & Restart
按钮,Docker 就会重启并应用配置的镜像地址了。
GitHub上有大量的开源项目,对应到docker下,就有Docker Hub,这上面有大量的高质量的镜像可以使用。
获取镜像的命令:
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull --help
命令看到,这里我们说一下镜像名称的格式。
<域名/IP>[:端口号]
。默认地址是 Docker Hub。<用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为 library
,也就是官方镜像。开始获取镜像:
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:16.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 16.04
的镜像。
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的
sha256
的摘要,以确保下载一致性。
这里的速度还是很快的,原因是前面设置了镜像加速器,如果没有镜像加速器,那么就会下载很慢。
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的ubuntu:16.04 为例,启动里面的 bash (linux默认的shell)并且进行交互式操作的话,可以执行下面的命令,并且可以看出来当前ubuntu的版本,之后使用exit来退出镜像。
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
使用 docker image ls
命令来查看:
列表包含了 仓库名
、标签
、镜像 ID
、创建时间
以及 所占用的空间
。
其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。
使用docker system df
来查看镜像,容器数据卷所占用的空间
如果要删除本地的镜像,可以使用 docker image rm
命令,其格式为:
$ docker image rm [选项] <镜像1> [<镜像2> ...]
前面已经使用了docker image ls命令来查看了镜像的名字
可以用镜像的完整 ID,也称为 长 ID
,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID
来删除镜像。docker image ls
默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。
也就是说,假如说要删除ubuntu镜像,那么就可以使用下面的命令:
$ docker image rm b9e
也可以使用镜像名
,也就是 <仓库名>:<标签>
,来删除镜像。
$ docker image rm ubuntu
Untagged:ubuntu:16.04
什么是docker镜像,从前面找,从docker hub上pull下来的ubuntu:16.04就是docker镜像,它是用来干什么的?它是一个文件系统,这个文件系统提供两部分内容:
镜像不包含任何的动态数据,它的内容在构建之后不会发生改变,自己感觉有点像程序和进程的概念。
docker这个镜像,实际上不是由一个个文件组成的,是由多层文件系统联合组成,它使用了Union FS技术(wiki),docker镜像我们自己是可以构建的,它在构建的时候,会一层一层的构建,前一层时候一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。举个例子来说就是:删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
这里就是前面说的,有点像程序和进程的概念,镜像就像是程序,他是死的静态的,而容器就像是进程,可以被创建、启动、停止、删除、暂停。
与虚拟机混淆:
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的
root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
这里还有一些概念,但是这里还是有点看不懂,标记下,先往后看
一句话来说就是:一个集中的存储、分发镜像的服务
官方免费的公共服务
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服务,这里没有实际使用过,实际使用过之后再说。
安装好Docker环境后,在终端中使用docker search nginx
命令查找该镜像,然后通过docker pull nginx
获取到nginx的镜像,验证是否成功获取的命令是docker images
。
docker run -p 8080:80 -d nginx
docker run
是运行容器
关于参数:
-d :是让容器在后台运行,也就是作为守护进程执行。
-p:将容器内部的端口80,映射到我们的主机的8080端口。
nginx是镜像名。
本地有一个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的名字
说明:写文档时是在本地写的,但直接粘贴到这里不能识别,GitHub支持显示网页的图片,我就把用到的截图放到自己的github主页里,然后下面每一个小图片点击之后可以跳转到主页查看。
1、安装
1、注册docker community的账号,用户名:linkinp
2、下载安装
3、检查安装的docker的版本:
也可以检测出来docker的版本
4、该进行docker version命令,但是发生了错误,这里的错误在查过后发现是因为没有翻墙造成的,那么就要给mac翻墙,天哪噜,GitHub上的方案:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/3-macos-setup-guide-cn.md
5、在翻过墙之后,再输入docker version命令,显示如下:
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服务器:
服务器运行后,可以访问 http://localhost,看到如下界面
之后停止服务器并删除。
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`,也就是官方镜像。
开始获取镜像:
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是
ubuntu:16.04
,因此将会获取官方镜像library/ubuntu
仓库中标签为16.04
的镜像。从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的
sha256
的摘要,以确保下载一致性。这里的速度还是很快的,原因是前面设置了镜像加速器,如果没有镜像加速器,那么就会下载很慢。
3、使用镜像
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的ubuntu:16.04 为例,启动里面的 bash (linux默认的shell)并且进行交互式操作的话,可以执行下面的命令,并且可以看出来当前ubuntu的版本,之后使用exit来退出镜像。
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
命令来查看:列表包含了
仓库名
、标签
、镜像 ID
、创建时间
以及所占用的空间
。其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。
使用
docker system df
来查看镜像,容器数据卷所占用的空间5、删除本地镜像
如果要删除本地的镜像,可以使用
docker image rm
命令,其格式为:$ docker image rm [选项] <镜像1> [<镜像2> ...]
前面已经使用了docker image ls命令来查看了镜像的名字
可以用镜像的完整 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. 获取镜像
安装好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 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命令点赞!
- 思考一下除了docker cp还能怎么修改index.html?
- 可以对涉及到的docker search,docker pull,docker run,docker cp等命令作进一步实验,反馈各个参数测试结果。
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页面。
根据Google搜索安装Docker环境,设置好相关配置,验证Docker是否安装成功。
使用docker run hello-world
命令来来确认是否正确安装,该命令会下载一个测试镜像然后开启一个容器运行。当容器运行之后会输出一段”hello from Docker!"消息然后退出
安装好Docker环境之后,查找镜像:
docker search nginx
获取镜像:
docker pull nginx
验证是否成功获取到镜像:
docker images
docker run -p 8080:80 -d nginx
-p 8080:80
: 将nginx容器的80端口映射到主机的8080端口docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS说明:
docker ps
这条命令用来列出容器的信息
现在通过浏览器访问localhost:8080可以得到“Welcome to nginx! ”
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命令点赞!
- 思考一下除了docker cp还能怎么修改index.html?
- 可以对涉及到的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 ? 😏
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”的页面呢 ❓
docker stop 和 docker kill 在执行docker run 命令创建一个新容器后,我们可以使用docker ps列出所有在运行的的容器,docker ps -a则可以列出所有的容器,包含未运行的。 有了开始我们就会想到如何让容器停止运行呢? 这里我找到了两个命令docker stop和docker kill 一开始我望文生义,觉得docker stop 只是对某容器暂停运行,而docker kill则是将该容器”杀死“清除掉。 但是我用的时候发现被我kill掉的容器还可以重新被start,那 stop和kill 命令不是一样了吗?
带着疑惑查了文档找到这么一句话: docker stop 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 可以清楚的看到它们两最终都会将容器SIGKILL掉也就是停止运行,而区别在于使用stop命令停止容器之前,它会先向容器发送一个SIGTERM信号,而容器接收到该信号时会执行一系列的收尾工作,不至于”死的不明不白“。 而将一个容器从ps列表上完全清除则需要用命令docker rm。
* 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的异同么?
安装好docker后查看当前版本号docker version
,不一样的是会呈现出众多信息,如分为客户端与服务器,其下又涵盖如API、GO、Git等版本信息,docker是基于go语言的开源容器引擎,那么这些应该是其所必备的环境
运行测试docker run hello-world
,会提示找不到本地而去拉取库文件中的镜像,在拉取镜像的时候会输出获取镜像的每一层信息,每个镜像都是由很多层次构成
docker客户端会去连接守护进程,守护进程则通过访问docker hub拉取这个镜像,依靠镜像创建出一个新容器(运行一个产生在读信息输出的可执行文件),守护进程将其流转向docker客户端即个人终端
查看docker的架构,docker利用容器运行应用,而容器则是从镜像创建的运行实例,仓库是集中存放镜像文件的场所,用户可在docker hub注册自己的个人仓库,将创建好的镜像push上去,如同git操作
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器,Docker 容器通过 Docker 镜像来创建,Docker 客户端通过命令行或其他工具使用 Docker API 与 Docker 的守护进程通信
那么docker run时在后台运行的操作都有哪些呢
检查本地是否存在指定的镜像,不存在就从公有仓库下载,利用镜像创建并启动一个容器 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去,从地址池配置一个 ip 地址给容器 执行用户指定的应用程序,执行完毕后容器被终止
docker run -i -t ubuntu:15.10 /bin/bash
来指定ubuntu 版本镜像下创建一个新容器使用(真心赞)docker ps -a
可查看所有的容器列表,而docker rm ID/NAMES
将会移除容器,不过必须先docker stop name
停止容器
-docker start
则可再次启动已经停止的容器,docker restart
即重启容器操作-t:在新容器内指定一个伪终端或终端。 -d:让容器在后台运行,以守护态形式运行 -i:允许你对容器内的标准输入 (STDIN) 进行交互
通过docker images
可列出所有的镜像文件,docker search
命令来搜索所需要的镜像,docker rmi ID/NAMES
移除镜像
Nignx是开源的高效 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议
通过命令docker run -p 80:80 --name mynginx -d nginx
将在本地80端口查看到欢迎界面
在运行容器时可通过-p将容器内部端口绑定到指定的主机端口上,通过浏览器便可进行访问操作
直接修改/etc/docker/daemon.json文件,如下图所示
docker pull nignx
创建一个static-html-directory目录,其中放入自己的html文件 my.html,下一步开始写dockerfile创建一个新的镜像。 这个dockerfile总共两行,第一步设置基础镜像为我们刚刚pull的nginx。然后将宿主机上的static-html-directory中的所有文件复制到容器的/usr/share/nginx/html目录中,值得注意的是该目录并不会被拷贝到dst目录中。
COPY命令有两个参数第一个参数 src 是宿主机中的拷贝源路径,dst是容器中的目的路径。dockerfile写完之后,使用docker build命令构建镜像。
在构建镜像时会出现如下错误, 这是因为使用docker build命令必须要制定一个上下文。这个上下文就是在构建镜像时所需要的一系列文件,比如在使用COPY命令时需要拷贝到容器的源文件。这个上下文可以使用路径指定或者URL来指定。
当我们指定上下文来自 "." 时,可以看到镜像可以正常构建。镜像名为a_new_nginx,该镜像内的html就是我们自己写的html。
接下来我们就可以运行自己创建的镜像,我们需要把容器内nginx使用的80端口映射到宿主机上的8080端口。
使用docker run命令的 -p选项来设置宿主机和容器的端口映射。
打开浏览器看到如下页面,说明我们的nginx容器就运行成功了。
本文中所用到的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的配置指南
安装Docker命令:
允许非root用户:
拉docker镜像:
查看已安装docker镜像:
启动nginx服务
列出运行中的容器
编辑html文件,添加Hello Docker World
拷贝文件:
查看主页: localhost:8080
* 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
,它可以被进程捕获并解读或者被忽略。这一机制允许进程释在适当情况下先释放资源,保存状态后再“优雅的”终结。SIGINT
和SIGTERM
几乎相同。
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
向进程发送使其立即终止的信号。与SIGINT
和SIGTERM
不同,SIGKILL
不能被捕获或者忽略,并且进程在接收到该信号时不能执行任何的清理。
* 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
,它可以被进程捕获并解读或者被忽略。这一机制允许进程释在适当情况下先释放资源,保存状态后再“优雅的”终结。SIGINT
和SIGTERM
几乎相同。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
向进程发送使其立即终止的信号。与SIGINT
和SIGTERM
不同,SIGKILL
不能被捕获或者忽略,并且进程在接收到该信号时不能执行任何的清理。
感谢!我学到了!
在了解对云计算和容器的历史后,大家应该都安耐不住要动手了。
那么这次的问题是:
补充说明 如果有条件的话尽量在Linux的机器上进行实验