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

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

5.  简单测试,hello-world

命令1:

sudo docker run hello-world

效果图:

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 的二进制执行文件。

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

效果如下:

各个参数解析:

-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"

效果如下:

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

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

            sudo docker logs 6755bbb0ea69

            效果如上图所示。

      4. 停止容器

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

            sudo docker stop 6755bbb0ea69

            效果如下:

注:上述命令和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: (这里没有使用)后面接容器的名字,没有这个参数,系统将随机给该容器命名。

3.   查看该应用程序

sudo docker ps

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

0.0.0.0:32768->5000/tcp

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

18.222.11.210:32768

注:如果是像我一样用的云服务器,有一点很重要,那就是开出相应的端口,比如我这里,就要在云服务器开启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

5.   查看webapp的程序日志

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

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

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

6.   查看webapp容器的进程

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

sudo docker top ba25c9de3990


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 hub上有很多公共镜像,我们可以用search命令查找我们需要的镜像。如下所示:

           sudo docker search ubuntu

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

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

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 images命令查看我们新创建的镜像(上图第一个)。

各个参数说明:

-m: 提交的描述信息

-a: 指定镜像作者

61d405c7eb5a:容器ID

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

v1: 新镜像的TAG

4.   设置镜像标签

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

sudo docker tag f882cc9edd98 dreamboy1/ubuntu:v2

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

 

六、Docker实例之Tomcat

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

1.     查找和拉取

命令1: sudo docker search tomcat

命令2: sudo docker pull tomcat

2.     运行容器

命令:

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

参数说明:

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

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

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

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

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

3.     配置webapp

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

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

 

七、经验总结

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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值