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还有更多的东西等着去探索。