docker
一、简介
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。
一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。下面这张图片展示了一个运行中的容器。
二、docker的安装
1、安装系统依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加docker yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、更新 yum 缓存
sudo yum makecache fast
4、安装 Docker-ce:
sudo yum -y install docker-ce
5、启动
sudo systemctl start docker
6、测试hello world,会先下载hello-world这个镜像
docker run hello-world
7、删除docker
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
三、运行docker
1、runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
docker run 运行一个镜像。
ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
2、运行交互式的容器
[root@localhost ~]# docker run -i -t ubuntu:15.10 /bin/bash
root@31c2c31aebbb:/#
各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
此时我们已进入一个 ubuntu15.10系统的容器。
3、后台模式启动容器
[root@localhost ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1443d4857fea2462bf2ae724442a589bc28f17d1b3c90045b5808b973d975e33
在输出中,我们没有看到期望的"hello world",而是一串长字符,这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1443d4857fea ubuntu:15.10 "/bin/sh -c 'while t…" 3 minutes ago Up 2 minutes epic_kalam
[root@localhost ~]#
在容器内使用docker logs命令,查看容器内的标准输出
[root@localhost ~]# docker logs 1443d4857fea
hello world
hello world
hello world
hello world
hello wo
4、停止容器
我们使用 docker stop 命令来停止容器:
6、下载镜像
docker pull 命令来从 Docker Hub 公共镜像源下载镜像。
7、docker search 搜索镜像
四、创建镜像
1.从已经创建的容器中更新镜像,并且提交这个镜像
[root@localhost ~]# docker run -t -i ubuntu:15.10 /bin/bash
root@a6777c5267e9:/# apt-get update
更新完提交:
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID
runoob/ubuntu:v2:指定要创建的目标镜像名
2.使用 Dockerfile 指令来创建一个新的镜像
使用命令 docker build , 从零开始来创建一个新的镜像。需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
五、Docker容器的连接
1、网络端口映射
创建了一个 python 应用的容器
docker run -d -P training/webapp python app.py
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py //绑定UDP端口
2、Docker容器连接
1)在同一宿主机下,docker容器通过docker网桥进行连接,默认情况下,同一宿主机下的所有容器都可以连接。
但是容器的ip可能随着容器重启而变化,所以docker提供了link选项提供可靠连接。
docker run --link=[CONTAINER]:[ALIAS] [IMAGE] [COMMAND]
docker run -it --name test1 --link=test2:web centos
// 根据centos镜像启动一个名为test1的容器并将连接到test2上的连接起一个别名web。这样在启动test1后,比如使用```ping web```就表示ping test2容器
link原理是在启动时自动添加环境变量(env命令查看)和修改了/etc/hosts文件。
2)overlay技术来将不同宿主机上的Docker容器连接起来,原文:http://dockone.io/article/1156
创建网络:sudo docker network create backend
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
dc54a853b99c backend bridge local
从server_img镜像中运行一个服务器容器并且通过--net选项把它放置于之前配置的backend网络中
sudo docker run -itd --net=backend --name=server server_img /bin/bash
六、使用Dockerfile创建镜像
原文:https://www.cnblogs.com/jie-fang/p/7927643.html
1、基本结构
Dockerfile由一行行命令语句组成,并支持以#开头的注释行。看下面的例子,就是一些shell命令组合起来。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command ] ..
# Base image to use, this nust be set as the first line
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx
2、指令说明
指令的一般格式为INSTRUNCTION arguments,指令包括FROM、MAINTAINER、RUN等。具体指令及说明如下:
指令 | 说明 |
FROM | 指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像 |
MAINTAINER | 指定维护者信息 |
RUN | 运行命令,格式为:RUN<command>或RUN ["executable","param1","param2"]。后一个指令会被解析为json数组,所以必须使用双引号。RUN ["/bin/bash","-c","echo hello"] |
CMD | 指定启动容器时默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息,格式为:LABEL <key>=<value> <key>=<value> <key>=<value> ...例如:LABEL version="1.0" |
EXPOSE | 声明镜像内服务所监听的端口 |
ENV | 指定环境变量 |
ADD | 赋值指定的<src>路径下的内容到容器中的<dest>路径下,<src>可以为URL;如果为tar文件,会自动解压到<dest>路径下 |
COPY | 赋值本地主机的<scr>路径下的内容到容器中的<dest>路径下;一般情况下推荐使用COPY而不是ADD |
ENTRYPOINT | 指定镜像的默认入口 |
VOLUME | 创建数据挂载点 |
USER | 指定运行容器时的用户名或UID |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以--build-arg<varname>=<value>格式传入。 |
ONBUILD | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令 |
STOPSIGNAL | 容器退出的信号 |
HEALTHCHECK | 如何进行健康检查 |
SHELL |
指定使用SHELL时的默认SHELL类型,格式为: SHELL ["executable","parameters"] |
3、编写完Dockerfile之后,可以通过docker build命令来创建镜像。
基本的docker build [选项] 内容路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置Dockerfile的目录为空目录。
例如:指定Dockerfile所在路径为 /tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image,可以使用下面的命令:
docker build -t build_repo/first_image /tmp/docker_builder