docker入门实战笔记
1.什么是docker:
docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解.
Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;
Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;
docker运用场景:
web应用的自动化打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
可以看出来docker其实就是使得部署,发布变得更加快捷,更加自动化,且适应云平台环境.再看定义:
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、
OpenStack 集群和其他的基础应用平台。
意思很明显了.按照我的理解,先不考虑docker的实现方式,其实docker就是一个包含运行环境的应用,由于自身带有所有需要的运行环境促成了他的可移植性和快速部署.
docker应用环境的集成是通过一层一层的镜像叠加实现的,这种方式可以使得底层镜像多次复用,结构清晰.这里不赘述docker的具体实现原理,实战过后想来都会有一些理解.
2.docker安装
不同的linux系统安装docker会有些许不同,新版的redhat和centos7自带有docker包,直接安装即可.具体参考:docker安装
ubuntu14.04 docker:
$ sudo apt-get update
安装所有必须和可选的包
$ sudo apt-get install linux-image-generic-lts-trusty
重启系统
$ sudo reboot
查看你是否安装了wget
$ which wget
如果wget没有安装,先升级包管理器,然后再安装它。
$ sudo apt-get update $ sudo apt-get install wget
获取最新版本的 Docker 安装包
$ wget -qO- https://get.docker.com/ | sh
系统会提示你输入sudo密码,输入完成之后,就会下载脚本并且安装Docker及依赖包。
验证 Docker 是否被正确的安装
$ sudo docker run hello-world
上边的命令会下载一个测试镜像,并在容器内运行这个镜像。
###########################正常情况下以下内容可以不看######################################
Ubuntu Docker可选配置
这部分主要介绍了 Docker 的可选配置项,使用这些配置能够让 Docker 在 Ubuntu 上更好的工作。
创建 Docker 用户组
调整内存和交换空间(swap accounting)
启用防火墙的端口转发(UFW)
为 Docker 配置DNS服务
创建 Docker 用户组
docker 进程通过监听一个 Unix Socket 来替代 TCP 端口。在默认情况下,docker 的 Unix Socket属于root用户,当然其他用户可以使用sudo方式来访问。因为这个原因, docker 进程就一直是root用户运行的。
为了在使用 docker 命令的时候前边不再加sudo,我们需要创建一个叫 docker 的用户组,并且为用户组添加用户。然后在 docker 进程启动的时候,我们的 docker 群组有了 Unix Socket 的所有权,可以对 Socket 文件进行读写。
注意:docker 群组就相当于root用户。有关系统安全影响的细节,请查看 Docker 进程表面攻击细节
创建 docker 用户组并添加用户
使用具有sudo权限的用户来登录你的Ubuntu。
在这过程中,我们假设你已经登录了Ubuntu。
创建 docker 用户组并添加用户。
$ sudo usermod -aG docker ubuntu
注销登录并重新登录
这里要确保你运行用户的权限。
验证 docker 用户不使用 sudo 命令开执行 Docker
$ docker run hello-world
调整内存和交换空间(swap accounting)
当我们使用 Docker 运行一个镜像的时候,我们可能会看到如下的信息提示:
WARNING: Your kernel does not support cgroup swap limit. WARNING: Your
kernel does not support swap limit capabilities. Limitation discarded.
为了防止以上错误信息提示的出现,我们需要在系统中启用内存和交换空间。我们需要修改系统的 GUN GRUB (GNU GRand Unified Bootloader) 来启用内存和交换空间。开启方法如下:
使用具有sudo权限的用户来登录你的Ubuntu。
编辑 /etc/default/grub 文件
设置 GRUB_CMDLINE_LINUX 的值如下:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存和关闭文件
更新 GRUB
$ sudo update-grub
重启你的系统。
允许UFW端口转发
当你在运行 docker 的宿主主机上使用UFW(简单的防火墙)。你需要做一些额外的配置。Docker 使用桥接的方式来管理网络。默认情况下,UFW 过滤所有的端口转发策略。因此,当在UFW启用的情况下使用 docker ,你必须适当的设置UFW的端口转发策略。
默认情况下UFW是过滤掉所有的入站规则。如果其他的主机能够访问你的容器。你需要允许Docker的默认端口(2375)的所有连接。
设置 UFW 允许Docker 端口的入站规则:
使用具有sudo权限的用户来登录你的Ubuntu。
验证UFW的安装和启用状态
$ sudo ufw status
打开和编辑/etc/default/ufw文件
$ sudo nano /etc/default/ufw
设置 DEFAULT_FORWARD_POLICY 如下:
DEFAULT_FORWARD_POLICY="ACCEPT"
保存关闭文件。
重新加载UFW来使新规则生效。
$ sudo ufw reload
允许 Docker 端口的入站规则
$ sudo ufw allow 2375/tcp
Docker 配置 DNS 服务
无论是Ubuntu还是Ubuntu 桌面繁衍版在系统运行的时候都是使用/etc/resolv.conf配置文件中的127.0.0.1作为域名服务器(nameserver)。NetworkManager设置dnsmasq使用真实的dns服务器连接,并且设置 /etc/resolv.conf的域名服务为127.0.0.1。
在桌面环境下使用这些配置来运行 docker 容器的时候, Docker 用户会看到如下的警告:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
该警告是因为 Docker 容器不能使用本地的DNS服务。相反 Docker 使用一个默认的外部域名服务器。
为了避免此警告,你可以给 Docker 容器指定一个DNS服务器。或者你可以禁用 NetworkManager 的 dnsmasq。不过当禁止 dnsmasq 可能使某些网络的DNS解析速度变慢。
为 Docker 指定一个DNS服务器
使用具有sudo权限的用户来登录你的Ubuntu。
打开并编辑 /etc/default/docker
$ sudo nano /etc/default/docker
添加设置
DOCKER_OPTS="--dns 8.8.8.8"
使用8.8.8.8替换如192.168.1.1的本地DNS服务器。你可以指定多个DNS服务器,多个DNS服务器使用空格分割例如
--dns 8.8.8.8 --dns 192.168.1.1
警告:如果你正在使用的电脑需要连接到不同的网络,一定要选择一个公共DNS服务器。
保存关闭文件。
重启 Docker 进程
$ sudo restart docker
或者,作为替代先前的操作过程,禁止NetworkManager中的dnsmasq(这样会使你的网络变慢)
打开和编辑 /etc/default/docker
$ sudo nano /etc/NetworkManager/NetworkManager.conf
注释掉 dns = dsnmasq:
保存关闭文件
重启NetworkManager 和 Docker
$ sudo restart network-manager $ sudo restart docker
升级Docker
在wget的时候使用-N参数来安装最新版本的Docker:
$ wget -N https://get.docker.com/ | sh
###########################正常情况下以上内容可以不看######################################
###########################安装镜像方法一######################################
下载镜像
首先,访问 Docker 中文网,在首页中搜索名为“centos”的镜像,在搜索的结果中,有一个“官方镜像”,它就是我们所需的。
然后,进入 CentOS 官方镜像页面,在“Pull this repository”输入框中,有一段命令,把它复制下来,在自己的命令行上运行该命令,随后将立即下载该镜像。
查看本地所有的镜像:
docker images
当下载完成后,您应该会看到:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB
如果看到以上输出,说明您可以使用“docker.cn/docker/centos”这个镜像了,或将其称为仓库(Repository),该镜像有一个名为“centos6”的标签(Tag),此外还有一个名为“25c5298b1a36 ”的镜像 ID(可能您所看到的镜像 ID 与此处的不一致,那是正常现象,因为这个数字是随机生成的)。此外,我们可以看到该镜像只有 215.8 MB,非常小巧,而不像虚拟机的镜像文件那样庞大。
现在镜像已经有了,我们下面就需要使用该镜像,来启动容器。
启动容器
只需使用以下命令即可启动容器:
docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash
这条命令比较长,我们稍微分解一下,其实包含以下三个部分:
docker run <相关参数> <镜像 ID> <初始命令>
其中,相关参数包括:
-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
假设我们的所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:docker.cn/docker/centos:centos6。
初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。
安装相关软件
为了搭建 Java Web 运行环境,我们需要安装 JDK 与 Tomcat,下面的过程均在容器内部进行。我们不妨选择/opt/目录作为安装目录,首先需要通过cd /opt/命令进入该目录
安装 JDK
首先,解压 JDK 程序包:
tar -zxf /mnt/software/jdk-7u67-linux-x64.tar.gz -C .
然后,重命名 JDK 目录:
mv jdk1.7.0_67/ jdk/
安装 Tomcat
首先,解压 Tomcat 程序包:
tar -zxf /mnt/software/apache-tomcat-7.0.55.tar.gz -C .
然后,重命名 Tomcat 目录:
mv apache-tomcat-7.0.55/ tomcat/
设置环境变量
首先,编辑.bashrc文件
vi ~/.bashrc
然后,在该文件末尾添加如下配置:
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME
最后,需要使用source命令,让环境变量生效:
source ~/.bashrc
编写运行脚本
我们需要编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat,具体过程如下:
首先,创建运行脚本:
vi /root/run.sh
然后,编辑脚本内容如下:
#!/bin/bash source ~/.bashrc sh /opt/tomcat/bin/catalina.sh run
注意:这里必须先加载环境变量,然后使用 Tomcat 的运行脚本来启动 Tomcat 服务。
最后,为运行脚本添加执行权限:
chmod u+x /root/run.sh
退出容器
当以上步骤全部完成后,可使用exit命令,退出容器。
随后,可使用如下命令查看正在运行的容器:
docker ps
此时,您应该看不到任何正在运行的程序,因为刚才已经使用exit命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:
docker ps -a
输出如下内容:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57c312bbaad1 docker.cn/docker/centos:centos6 "/bin/bash" 27 minutes ago Exited (0) 19 seconds ago naughty_goldstine
记住以上CONTAINER ID(容器 ID),随后我们将通过该容器,创建一个可运行 Java Web 的镜像。
创建 Java Web 镜像
使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:
docker commit 57c312bbaad1 javaweb:0.1
该容器的 ID 是“57c312bbaad1”,所创建的镜像名是“javaweb:0.1”,随后可使用镜像来启动 Java Web 容器。
启动 Java Web 容器
有必要首先使用docker images命令,查看当前所有的镜像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE javaweb 0.1 fc826a4706af 38 seconds ago 562.8 MB docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB
可见,此时已经看到了最新创建的镜像“javaweb:0.1”,其镜像 ID 是“fc826a4706af”。正如上面所描述的那样,我们可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,我们现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:
docker run -d -p 58080:8080 --name javaweb javaweb:0.1 /root/run.sh
稍作解释:
-d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。
-p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。
--name:表示容器名称,用一个有意义的名称命名即可。
关于 Docker 网桥的内容,需要补充说明一下。实际上 Docker 在宿主机与容器之间,搭建了一座网络通信的桥梁,我们可通过宿主机 IP 地址与端口号来映射容器内部的 IP 地址与端口号,
当运行以上命令后,会立即输出一长串“容器 ID”,我们可通过docker ps命令来查看当前正在运行的容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82f47923f926 javaweb:0.1 "/root/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:58080->8080/tcp javaweb
在浏览器中,输入以下地址,即可访问 Tomcat 首页:
http://192.168.65.132:58080/
注意:这里使用的是宿主机的 IP 地址,与对外暴露的端口号 58080,它映射容器内部的端口号 8080。
由于我测试的虚拟机采用nat映射连接,如果采用这种方法测试则需要重新将58080端口映射到宿主主机才能够访问
###########################安装镜像方法二#####################################
导入镜像centos7:
docker load -i centos7 导入本地仓库
编写安装jdk的Dockerfile
#####dockerfile语法######
Dockerfile关键字 # CommentINSTRUCTION arguments FROM 基于哪个镜像 RUN 安装软件用 MAINTAINER 镜像创建者 CMD container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD. CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。如: Dockerfile: CMD echo hello world 运行一下试试: edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd hello world 一旦命令匹配: edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd echo hello edwardsbean hello edwardsbean ENTRYPOINT container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条 ENTRYPOINT没有CMD的可替换特性 USER 使用哪个用户跑container 如: ENTRYPOINT ["memcached"] USER daemon EXPOSE container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射: docker run -d -p 127.0.0.1:33301:22 centos6-ssh container ssh服务的22端口被映射到主机的33301端口 ENV 用来设置环境变量,比如: ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 ADD 将文件<src>拷贝到container的文件系统对应的路径<dest> 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0 如果文件是可识别的压缩格式,则docker会帮忙解压缩 如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下 如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如: docker build github.com/creack/docker-firefox docker-firefox目录下必须有Dockerfile和要ADD的文件 注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file. ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。 VOLUME 可以将本地文件夹或者其他container的文件夹挂载到container中。 WORKDIR 切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效 ONBUILD ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
#####dockerfile语法######
###########脚本###########################
# Version: 1.0.0 # Create Time: 2015-10-16 09:04 # Author: baibai # Description: 在最新版本的ubuntu系统中安装jdk,构建可执行java的环境 FROM index.tenxcloud.com/tenxcloud/ubuntu:latest MAINTAINER Li Siqi "lisiqi_jerry@163.com" # 将jdk安装压缩包解压到/home/jdk1.8.0_51 ADD jdk-8u51-linux-x64.tar.gz /home/ # 安装中文语言包 #RUN locale-gen zh_CN.UTF-8 # 设置java环境变量 ENV JAVA_HOME /home/jdk1.8.0_51 ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin # 设置语言环境变量 ENV LANG zh_CN.UTF-8 ENV LANGUAGE zh_CN:zh ###########脚本########################### 运行命令 docker build -t 自定义名称 路径 生成一个镜像 docker images 查看当前所有镜像 接下来用同样的方式运行tomcat ###########脚本########################### # Version: 1.0.0 # Create Time: 2015-12-25 11:04 # Author: Lin Nan # 基于已经配置好的jdk1.8版本进行操作 FROM jdk:latest MAINTAINER Li Nan <593158016@qq.com> # 创建目录 #RUN mkdir -p -m 777 /home # 将context中的压缩包迁移到容器中并解压 ADD tomcat8.tar.gz /home/tomcat8/ # 暴露文件目录 #VOLUME ["/home/docker/file/distfirstout", "/home/docker/file/input/D001"] #VOLUME ["/app/tomcat8/webapps/"] # 暴露网络端口 EXPOSE 8881 # 启动服务 ENTRYPOINT ["/home/tomcat8/apache-tomcat-8.0.24/bin/catalina.sh", "run"]
###########脚本###########################
执行命令
docker build --no-cache=true -t tomcat8 路径
docker run -d -p 8881:8080 --name=tomcat8 tomcat8
###########################安装镜像方法二结束#####################################
##################################################################################################### 完
常用命令:
docker images 查看镜像 docker ps 查看容器 docker ps -a 查看所有容器,包括没有运行的 docker rm 删除容器 docker rmi 删除镜像 docker build 新建镜像 docker run 运行容器 docker stop 停止容器 docker logs 查看日志 docker load 导入镜像 docker save 导出镜像 docker commit 容器生成镜像
用一行命令大扫除:
docker kill $(docker ps -q) ;
docker rm $(docker ps -a -q) ;
docker rmi $(docker images -q -a)
使用挂在方式搭载镜像的方式
http://www.linuxidc.com/Linux/2015-01/112485.htm
各个系统安装docker的方式
http://docker.widuu.com/installation/ubuntu.html