Docker学习记录

一、学习目的

      众所周知,各种各样的编程语言都有其要求的编程环境。比如说java需要jdk,C需要Linux环境。特别是对于Web编程来说,诸如ionic,angularJS,Vue等等,在开发这些语言的应用之前,都需要给其配好相应的环境。问题来了,五花八门的语言环境不仅凌乱,而且在配置上极其麻烦,运气好地话,能够几遍就解决。运气不好,光是配置环境就要折腾几天。这种情况下,Docker应运而生。

      其实Docker的作用类似于虚拟机,它为每种语言提供一个容器,而这些容器,提供了该语言需要的开发和运行环境,所以,用该语言开发的程序能够在该容器内运行。这种情况下,Docker就为用户的开发解决了各种各样的配置问题。接下来,我将通过我自己的学习经历,介绍Docker学习中的一些要点。

二、安装配置

      Docker虽说是为了解决其他语言环境配置而创造出来的,但免不了Docker也有自己的安装配置。综合了各个网站和博客的内容,我总结了一份成功率较高的ubuntu下安装Docker的方式(不敢说肯定能成功,因为不同的ubuntu系统可能会因为某些不知名的原因安装失败)。

1.  我的Docker安装环境

云服务器:Ubuntu 16.04.4 LTS

2.  安装Docker社区版(CE)仓库

命令1:

sudo apt-get-y install \

  apt-transport-https\

  ca-certificates\

  curl

命令2

curl -fsSLhttps://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

命令3:

sudo add-apt-repository \

       "deb [arch=amd64]https://download.docker.com/linux/ubuntu \

       $(lsb_release -cs) \

       stable"

命令4:

sudo apt-get update

3.  在Ubuntu上安装最新的Docker社区版

命令1:

sudo apt-get-y install docker-ce

4.  查看版本

命令1:

docker version

如果一切正常,那么大致会有如下图的显示:

Docker学习记录

5.  简单测试,hello-world

命令1:

sudo docker run hello-world

效果图:

Docker学习记录

6.  镜像加速

因为在这里我用的是aws服务,我的ubuntu服务器在美国,所以在执行上述hello-world命令时,并没有出现什么问题,正常显示。但是,如果是用一般的ubuntu系统,ubuntu虚拟机系统,执行上述命令时,会因为国内访问Docker Hub不稳定,导致出现timeout错误。这个问题可以通过使用阿里云,DaoCloud,或者网易的镜像来解决。这里以阿里云为例。

 

I.注册阿里云账号

II.访问:https://cr.console.aliyun.com/#/accelerator,获得自己的加速器:https://××××××.mirror.aliyuncs.com

III.执行以下命令:

命令1:

echo"DOCKER_OPTS=\"--registry-mirror=https://××××××.mirror.aliyuncs.com\"" | sudo tee -a/etc/default/docker

命令2:

sudo service docker restart

7.    至此,Docker的安装结束。

三、Docker的简单使用:

      1. helloworld 与容器的简单使用

            Docker允许在容器内执行应用程序,来看一个命令:

              sudo docker run ubuntu:15.10/bin/echo "Hello world"

            效果如下:

Docker学习记录

各个参数解析:

docker: Docker 的二进制执行文件。

run: 与前面的 docker 组合来运行一个容器。

ubuntu:15.10: 指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

/bin/echo "Hello world":  在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

      2. 运行交互式容器:

通过加上参数 –i –t,让docker运行的容器实现简单“对话”的能力。执行如下命令: sudo docker run -i -t ubuntu:15.10 /bin/bash

效果如下:

Docker学习记录

各个参数解析:

-t: 在新容器内指定一个伪终端或终端。

-i: 允许你对容器内的标准输入 (STDIN) 进行交互。

此时我们已进入一个 ubuntu15.10系统的容器,我们可以通过运行exit命令或者使用CTRL+D来退出容器。

3. 启动容器与停止容器:

使用以下命令创建一个以进程方式运行的容器:

sudo docker run -d ubuntu:15.10/bin/sh -c "while true; do echo hello world; sleep 1; done"

效果如下:

Docker学习记录

在执行上述命令后,屏幕上打印出“6755bbb0ea69c719ff71856454c5cfc6e0ffe747449f1fc69e2c3b860404e030”这样一个长字符串,这个所创建的容器的id,此时,这个容器正在后台运行。

使用“sudo dockerps”命令,将docker下所有运行的程序打印出来。这里重点关注两个属性:CONTAINER ID和   NAMES,这两个属性分别是容器的id和名字,可以用来接下来的操作。比如说之前创建该容器时,让它打印hello world,使用logs命令将其显示出来,命令如下:

            sudo docker logs 6755bbb0ea69

            效果如上图所示。

      4. 停止容器

            当要停止某个容器时,用stop命令,具体命令如下:

            sudo docker stop 6755bbb0ea69

            效果如下:

Docker学习记录

注:上述命令和id相关的部分均可用NAMES来替代。

四、Docker容器运行web应用

第三点涉及的都是一些简单的应用,其实际意义并不是很大,接下来,我们将尝试使用容器构建一个web应用。

1.   载入镜像

sudo docker pull training/webapp

2.   创建一个容器,并在容器中运行一个 PythonFlask 应用来运行一个web应用。

sudo docker run -d-P training/webapp python app.py

参数说明:

-d: 让容器在后台运行。

-P: 将容器内部使用的网络端口映射到我们使用的主机上。

--name: (这里没有使用)后面接容器的名字,没有这个参数,系统将随机给该容器命名。

Docker学习记录

3.   查看该应用程序

sudo docker ps

Docker学习记录

这时,我们发现,对比于前面的容器,此时的这个容器多了端口信息:

0.0.0.0:32768->5000/tcp

Docker 开放了 5000 端口(默认 PythonFlask 端口)映射到主机端口 32768上。这时我们可以通过浏览器访问WEB应用。我个人服务器的ipv4地址为:18.222.11.210,通过该地址和端口号访问:

18.222.11.210:32768

Docker学习记录

注:如果是像我一样用的云服务器,有一点很重要,那就是开出相应的端口,比如我这里,就要在云服务器开启32768(32769)端口。

上面截图端口为32769,是因为中间出了点问题,另外又开了一个容器,新容器端口为32769。

4.   指定webapp的端口

前面在默认情况下,我们将Docker的5000端口映射到主机32768端口上。我们也可以使用 –p 标识来绑定指定端口,命令如下:

sudo docker run -d -p 5000:5000 training/webapp python app.py

再次使用docker ps 查看,发现新的app端口号为5000

Docker学习记录

5.   查看webapp的程序日志

docker logs[ID或者名字] 可以查看容器内部的标准输出。

-f:让 dokcerlogs 像使用 tail -f 一样来输出容器内部的标准输出。

从下面,我们可以看到两个应用程序使用的是 5000 端口和32768端口,并且能够查看到应用程序的访问日志。

Docker学习记录

6.   查看webapp容器的进程

使用 docker top 来查看容器内部运行的进程

sudo docker top ba25c9de3990

Docker学习记录

7.   停止webapp

参照前文 三.4

8.   重启webapp

已经停止的容器,我们可以使用命令 docker start 来启动。

sudo docker start ba25c9de3990

docker ps-l 查询最后一次创建的容器:

正在运行的容器,我们可以使用 docker restart 命令来重启

9.   移除webapp容器

我们可以使用 docker rm 命令来删除不需要的容器

sudo docker rm ba25c9de3990

 注:删除容器时,容器必须是停止状态,否则会报错。

五、Docker镜像使用

我对镜像的个人理解是各种环境,通过这些镜像,Docker做到了各种编程语言环境的实现。当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

1.   获取镜像

除了简介中所说的,在运行容器时临时下载所需的镜像,也可以用pull命令下载已知的镜像。如下所示:

sudo docker pull httpd

Docker学习记录

在Docker hub上有很多公共镜像,我们可以用search命令查找我们需要的镜像。如下所示:

           sudo docker search ubuntu

Docker学习记录

找到我们需要的镜像以后,就可以用pull命令获取。

对于本机上的镜像,可以使用docker images命令列出。如下所示:

Docker学习记录

2.   创建镜像

当仓库中的镜像不能满足我们的需求时,我们可以选择自己创建一个镜像或者更新我们已有的镜像。

关于如何从零开始创建镜像,我只知道步骤,并没有亲自尝试过,所以这里也就简单谈一下就好。其实我个人也是不怎么推荐这样做的,因为Docker hub中的镜像已经足够我们使用了。

使用命令 dockerbuild , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。(具体内容就不细说了)

3.   更新镜像

镜像的更新其实和我们平时更新系统很类似。以一个ubuntu镜像为例,先用该镜像创建一个容器:

docker run -t -i ubuntu:15.10 /bin/bash

这时我们就进入了该镜像的终端,在这个终端内用apt-get update命令像更新一般的ubuntu系统一样更新镜像。

在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

Docker学习记录

提交完成后,我们用docker images命令查看我们新创建的镜像(上图第一个)。

各个参数说明:

-m: 提交的描述信息

-a: 指定镜像作者

61d405c7eb5a:容器ID

dreamboy/ubuntu: 指定要创建的目标镜像名

v1: 新镜像的TAG

4.   设置镜像标签

使用 docker tag 命令,为镜像添加一个新的标签。

sudo docker tag f882cc9edd98 dreamboy1/ubuntu:v2

通过上述命令可以发现,tag后面的参数是要添加标签的镜像,不仅可以添加标签,其REPOSITORY也是可以修改的。

Docker学习记录

 

六、Docker实例之Tomcat

Docker要安装Tomcat,其实就是要创建Tomcat的镜像。前文已经说到,需要新的镜像,要么创建Dockerfile,要么从Docker hub获取。我这里采取直接从Docker hub中获取的方式。

1.     查找和拉取

命令1: sudo docker search tomcat

命令2: sudo docker pull tomcat

Docker学习记录

2.     运行容器

命令:

sudo docker run --name tomcat -p 8089:8080 -v $PWD/testapp:/usr/local/tomcat/webapps/ROOT-d tomcat 

Docker学习记录

参数说明:

--name tomcat: 将容器命名为tomcat。

-p 8089:8080:将容器的8080端口映射到主机的8089端口

-v $PWD/testapp:/usr/local/tomcat/webapps/test:将主机中当前目录下的testapp挂载到容器的/ROOT

末尾tomcat: 使用的是tomcat镜像。

这时候打开浏览器,用8089端口和ipv4地址访问(经典的tomcat)

Docker学习记录

3.     配置webapp

当然,我们使用tomcat不简单是为了看到这只猫,重要的是把我们要发布的东西放到服务器上去。回到前面那个-v参数,那个参数声明了将主机当前目录的testapp挂载到tomcat的根目录的ROOT上面。所以,我们只需把其他语言已经编译好的页面放到testapp下面即可。

Docker学习记录

这时,我们再次访问之前的地址,就能看到我们想要实现的webapp效果了。

Docker学习记录

 

七、经验总结

      当你看到这句话的时候,恭喜你,你已经成功得学会了Docker的一部分用法,至少是在理论上。其实已经没什么好总结的了,学习过程中可能出现的“雷区”,我都已经标明,该有的经验教训,也都在上文全部有记录。之所以写这段话,是觉得光是以上面的那张截图结束,有点别扭,于是你就看到了这样一段话。本来还想写一个nginx的实例的,但是觉得和tomcat的其实区别不是很大,也就放弃了。有一点很重要,我所写的只是皮毛!只是皮毛!只是皮毛!(重要的话说三遍)。Docker还有更多的东西等着去探索。