第一部分
一、docker简介
docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化容器时完全使用沙箱机制,互相之间不会有任何接口(类似IPhone的app),更重要的时容器性能开销极低。
二、docker应用场景
- Web 应用的自动化打包和发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 自动化测试和持续集成、发布。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
三、docker概念
- 镜像(Image):用于创建docker容器的模板,相当于一个root文件系统。
- 容器(Container):镜像是静态的定义,容器时镜像运行时的实体。容器时独立运行的一个或一组应用,容器可以被创建、启动、停止、暂停等。
- 仓库(Repository):仓库可以看成一个代码控制中心,用来存放镜像。
docker使用客服端-服务端(C/S)架构模式,使用远程API来管理和创建docker容器,docker容器通过docker镜像来创建。
四、docker大体工作流程
- 下载docke
- 启动docker
- 下载镜像到本地
- 启动docker容器
五、 centos安装docker
- 使用官方安装脚本自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
- 使用国内daocloud一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
- 手动安装
- 卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
- 使用docker仓库进行安装
yum install -y yum-utils \ device-mapper-persister-data \ lvm2
- 设置稳定仓库(阿里云)
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker engine-community
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 安装特定版本的docker
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
- 启动docker
systemctl start docker systemctl enable docker
- docker镜像加速
在/etc/docker/daemon.json中写入如下内容(如果文件不存在则新建该文件)
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]} systemctl daemon-reload systemctl restart docker```
六、docker特性
- 文件系统隔离
- 网络隔离
- 日志记录
- 交互式shell
- 资源隔离
第二部分
docker入门命令
- 帮助命令
docker version #显示docker详细信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --helo #显示docker帮助手册
- 镜像命令
docker search ubuntu #搜索镜像名为ubuntu的镜像
docker pull ubuntu #从仓库拉取名为ubuntu镜像,默认拉取最新版本
docker images #查看已拉取的镜像
docker rmi 镜像名 [标签] #删除镜像
docker rmi -f ${docker images -qa} #删除全部镜像
docker save -o /xxx/xx.tar #报错镜像为tar包
docker load -i /xxx/xx.tar #导入镜像
docker tag 镜像名:版本 新镜像名:版本 #复制镜像并且修改名称
docker commit -a 'xxx' -c 'xxx' 镜像ID 名字:版本 #提交镜像
-a:提交的镜像作者
-c:使用docker指令来创建镜像
-m:提交时说明文字
- 容器命令
docker run [可选参数] image #启动容器
-d:以后台方式运行并且返回ID
-i:使用交互式运行容器,通常与t同时使用
-p:指定容器端口 容器端口:物理机端口
-P:随机指定端口
-v:给容器挂载存储卷
docker ps -a #列出所有容器(不加-a就是正在运行的)
docker kill 容器实例ID #杀掉容器
docker rm 容器实例ID #删除容器(正在运行容器不能删除,除非加-f选项)
docker start 容器实例ID #启动容器
docker stop 容器实例ID #停止正在运行的容器
docker top 容器实例ID #查看容器内进程
docker restart 容器实例ID #重启容器
- 部署Nginx
- docker search nginx
- docker pull nginx
- docker images
- docker run -d --name nginx01 -p 80:80 nginx #启动容器
- docker ps #查看容器
- docker exec -it 容器ID /bin/bash
- 导出和导入容器
- 导出容器
docker export 容器ID > 目录文件名
- 导入容器
cat 容器名 | docker import - test/ubuntu:v1
小实例
- 载入镜像
docker pull training/webapp
- 启动镜像
#使用随机端口
docker run -d -P training/webapp python app.py
-d:让容器在后台运行
-P:将容器内部使用的网络端口随机映射到我们的主机上
#指定端口
docker run -d -p 5000:5000 tarining/webapp python app.py
- 查看运行容器
docker ps
- 查看网络端口
docker port 容器ID
docker port 容器名称
- 查看WEB应用程序日志
docker logs -f 容器ID
- 停止和重启容器
docker stop 容器ID
docker ps -a
docker start 容器ID
docker restart 容器ID
- 删除容器(删除时容器要处于停止状态)
docker rm 容器ID
小妙招:
docker stop $(docker ps -q) #停止所有容器
docker rm $(docker ps -aq) #删除全部容器
docker stop $(docker pa -q) & docker rm $(docker ps -aq) #一条命令搞定所有
docker rmi -f $(docker images -aq)
docker容器互联
docker有一个连接系统允许将多个容器连接在一起,共享连接信息,docker连接会创建一个父子关关系,其中父容器可以看出子容器的信息。
- 新建网络
docker network create -d bridge test-net
-d:参数指定docker网络类型,有bridge、overlay
- 连接容器
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
通过ping说明test1和test2,来证明建立互联关系。
- 设置DNS
可以在宿主机的/etc/docker/daemon.json文件中增加dns配置实现全部容器的DNS
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
docker run -it --rm ubuntu cat etc/resolv.conf #查看是否生效
#手动指定容器配置
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
参数说明:
--rm:容器退出时自动清理容器内部的文件系统。
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
第三部分
-
什么是dockerfile?
dockerfile是一个用来构建镜像的文本文件,文件内容包含一条条构建镜像所需的指令和说明。 -
使用dockerfile定制镜像(构建好的镜像内会有一个/usr/share/nginx/html/index.html文件)
在一个空目录下,新建一个名为dockerfile的文件,并在文件内提交以下内容:
FROM nginx
RUN echo "这是一个本地构建的nginx镜像"> /usr/share/nginx/html/index.html
- FROM和RUN指令的作用
FROM:定制的镜像都是基于FROM的镜像,这里的nginx就是定制需要的基础镜像。后续的操作都是基于nginx
RUN:用于执行后面跟着的命令行命令。有两种格式
shell格式:
RUN <命令行命令>
#<命令行命令>等同在终端操作的shell命令
exec格式:
RUN ["可执行文件","参数1","参数2"]
#例如
#RUN ["./test.php","dev","offline"]等价于RUN ./test.php dev offline
注意:dockerfile的指令每执行一次都会在docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://doenload.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
#会创建3层镜像,可简化为以下格式
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"\
&& tar -xvf redis.tar.gz
#以上,使用&&符号连接命令。只会创建1层镜像
-
创建镜像
在dockerfile文件的存放目录下,执行构建动作,如以下,通过目录下的dockerfile构建一个nginx:v3(镜像名称:镜像标签)。
注:最后的.代表本次执行的上下文路径
docker build -t nginx:v3
上下文路径,是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build命令得知这个路径后,会将路径下的所有内容打包。
解析:由于docker的运行模式是C/S。我们本机是C,docker引擎是S。实际的构建过程是在docker引擎下完成的,所有这个时候无法用到我们本机的文件。这就需要我们把我们本机的指定目录下的文件引擎打包提供给docker引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是dockerfile所在的位置。
注意:上下文路径不要放无用的文件,因为会一起打包发送给docker引擎,如果文件过多会造成过程缓慢。 -
指令详解
dockerfile 的命令摘要FROM- 镜像从那里来
MAINTAINER- 镜像维护者信息
RUN- 构建镜像执行的命令,每一次RUN都会构建一层
CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
VOLUME- 定义数据卷,如果没有定义则使用默认
USER- 指定后续执行的用户组和用户
WORKDIR- 切换当前执行的工作目录
HEALTHCHECH- 健康检测指令
ARG- 变量属性值,但不在容器内部起作用
EXPOSE- 暴露端口
ENV- 变量属性值,容器内部也会起作用
ADD- 添加文件,如果是压缩文件也解压
COPY- 添加文件,以复制的形式
ENTRYPOINT- 容器进入时执行的命令
制作镜像并且发布
- 注册docker hub账号(http://hub.docker.com/)
- 本机终端登录docke hub用户
docker login -u [账号名字] #登录命令
docker out #退出
docker push 账号/容器名字:版本号 #发布镜像到docker hub
- 在一个空目录下,新建一个名为Dockerfile文件,该文件夹内容如下
FORM centos:6.7 #基础镜像
MAINTAINER jjk "[email protected]" #作者信息
ENV MYPATH /usr/local #环境变量
WORKDIR $MYPATH #指定默认工作目录
RUN yum -y install vim #构建时安装vim
RUN yum -y install net-tools #构建时安装ifconfig
EXPOSE 80 #容器的端口
CMD echo #MYPATH
CMD echo "------------END-------------"
CMD /bin/bash
- 构建dockefile
docker build -f dockerfile -t mycent:1.9 .
-f:dockerfile文件目录
-t:新镜像名:TAG
- 使用docker history查看dockerfile构建过程。
- 发送到docker hub
docker tag SOURCE_IMAGE[:TAG] 自己账号名字/镜像名 #更改镜像名
docker push 自己账号名字/镜像名 #发送到docker hub
标签:容器,RUN,入门,--,学习,镜像,docker,ID
From: https://www.cnblogs.com/kalixcn/p/17338114.html