docker入门之容器、镜像、相关操作笔记

本次笔记知识来源于docker的第一本书

标签(空格分隔): docker


1 简介(几组概念)

1.1容器(是什么)

容器是运行在操作系统内核之上的用户空间。所以容器又称“操作系统级虚拟化”。
docker容器 :相比较虚拟化技术,它少了模拟层和管理层,直接调用系统接口所以容器可以比虚拟化(虚拟机更加的轻量级)。得益于linux的内核特性,命名空间,空间组,管理的容器与宿主机隔离更加彻底,拥有自己的网络,存储栈,资源管理能力。

docker是什么

它是开源引擎,是能将应用程序部署到容器上的开源引擎(说白了就是类似maven它是一种管理工具)。

1.1.1docker特点

1.快速让程序docker化,利用写时复制机制
2.职责分离,开发人员关注docker内的程序,运维人员关注管理docker容器。因环境在生产和开发时一直的所以减少因环境问题造成 测试一切正常,生产一堆问题。
3.鼓励微服务架构和面向服务开发,服务之间的关系就是容器建的互联关系。

1.2docker有什么好处

可以让依赖环境统一,让交付不用在纠结于依赖环境,有效较少部署的复杂度。
docker使cpu及资源的分配利用率更加高。
秒级删除/创建、拓展容器资源,可以作为云计算的基石。

1.3docker组件

docker客户端&服务器,也称为容器引擎
docker 镜像 支持读,不支持直接写,写时复制
docker容器 读取镜像后的运行
docker仓库 存放镜像

1.3.1docker客户端&服务器

docker客户端可以发送命令到docker服务器或者docker守护进程,通过此就能让docker完成操作并返回结果。其中docker守护进程是在docker主机之上,docker守护进程控制docker容器交互。
image_1dcgqku5e1r81cbm1j9a6qc1eop9.png-329.2kB

1.3.2docker镜像

地位是docker基石。
镜像可以通过层式结构来构建,通过一个个命令完成构建,可以理解为docker容器的源码,所以镜像的体积也比较小。

1.3.3register仓库

就是用于保存镜像用的,包括公有的和私有的镜像
公有的在docker hub上,私有的可自己构建在防火墙后面。

1.3.4容器

docker可帮助用户构建和运行容器,so docker可以将用户程序放进容器中运行,所以docker 可以跟我们开发程序的阶段做下对照, 镜像是处于构建打包阶段,容器是运行阶段。

1.3.5docker的包含技术组件

64位系统
一个原生的linux容器格式
linux内核命名空间,用于隔离网络,文件,和进程
隔离网络
文件隔离
进程隔离
资源隔离和分组:使用cgroup完成cpu和内存分配给docker容器。
写时复制:字面意思

2安装

具体安装可看书和博客网上有教学内容

第二章 docker的安装

安装先决条件

64位
linux内核3.8及以上
支持cgroup和namespace

3第三章 docker的容器操作

3.1查看docker的相关统计信息

docker info
image_1dedvqcmkg232d91d5p11kjvaf2p.png-31.3kB

3.2第一个容器创建

docker run -i -t ubuntu /bin/bash

-i 创建stdin标准输入流 -t创建tty伪终端 保证启动容器可以有一个交互shell。
交互流程介绍 本地是否有该镜像 有->根据镜像创建容器并告知容器运行什么命令
本地是否有该镜像 没有->去私库有没有->没有到docker hup上去拉取镜像保存到本地->根据镜像创建容器并告知容器运行什么命令

3.3使用第一个容器

跟正常的机器其实没有太多不同,但是在启动的时候容器内的那个进程必须是前台启动的,否则一会容器就停止了。

3.3.1启动内部操作

docker run -dit --name ubuntu /bin/bash
这个容器启动了,但是一会就停止了,因为木有一个程序在运行,一直在运行。
hostname
apt-get update & apt-get install vim # 安装一个vim

3.3.2退出

exit #退出
以上这个容器因为没有前台运行程序所以一退出这个程序就处于死亡状态。
我们可以让这个程序一致存活,前提是有一个前台程序运行着。比如写个脚本
docker run -dit ubuntu /bin/sh -c "while true;do echo 一直运行; done;

3.3.3docker客户端操作

docker ps -a #查看所有容器
docker ps #查看运行的容器
docker ps -l #查看最后的一个容器
docker run --name my_first_docker -i -t ubuntu /bin/bash
给容器命名

3.3.4附着容器

docker attach contain_id
通常我们是自己创建一个容器进程进行交互 docker exec -it container_id bash

3.3.5守护容器

就是后台运行容器
docker run --name daoman_contain -d ubuntu /bin/bash -c “while true; do echo hello_word ;sleep 1;done”
这个守护进程必须是在在运行的否则会立即停止掉
image_1dee08udv2j564v49e1v49h0436.png-20.3kB
docker日志跟踪
docker logs <\contain_id>
如果只看某段 也可以
docker logs -tail 100 <\contain_id>

3.3.6查看容器进程

docker top contain_name

3.3.7docker容器日志查看

docker logs contain_id
也可以-f用于跟踪容器的最新信息
通常容器在
image_1dee0dvuf1fpikei3q4fdr1b4c3j.png-18.8kB
这里面存在相关的容器日志信息。

3.3.8查看容器的统计信息

docker status contain_id/contain_name
可以看到该容器对应的cpu,io及内存使用情况
查看容器内的进程
docker run -m 指定给定的内存大小 -cpus $cpus 设置可运行的cpu数量(逻辑上的)

docker top container_id

3.3.9容器创建新进程

docker exec
通过该命令可以让容器启动新的进程任务,主要有两种后台进程和交互式进程
例:
docker exec -t -i contian_id/contain_name /bin/bash
启动交互式进程
docker exec -d contian_id/contain_name touch /etc/mm/aafile
启动后台任务在容器内部创建一个空文件 aafile

3.3.10容器停止

docker stop contain_id/name
该命令会对容器发送中断命令,如果需要马上停止也可以使用docker kill

3.3.11自动容器重启

–restart
docker run --restart=alway 总是重启
docker run --restart=on-failure:5 # 在非正常退出时重启,重启次数为5次

3.3.12深入容器

docker inspect contain_id # 获取容器信息
docker inspect --format=’{{.State.Running}}’ conatin_id # 获取选定的数据
这里的format之内的格式就是json对应的key的层级。

3.3.13 删除容器

docker rm contain_id/name
如果删除运行中的容器可使用
docker rm -f contain_id/name
docker cp 可以拷贝文件到容器内,或者从容器内拷贝文件到宿主机

其他命令补充

-v 指定挂载路径 -P container.port 宿主机随机端口映射容器内的端口
-p port:container.port 宿主机指定端口映射容器内的端口
–name 指定容器名称 --entrypoint=command 指定容器的启动脚本
-cpus 指定核数

4.第四章 docker镜像的创建

4.1什么是镜像

docker进项是文件叠加系统构成,最底层是文件引导系统bootfs,在容器启动后bootfs加载到内存中,之后会卸载,所以我们基本上不会与bootfs进行交互。
bootfs 引导文件系统
rootfs rpot文件系统
docker文件系统层结构
image_1dcip42rn1s21jticnqv4f1sv5m.png-126.4kB
docker镜像就是这种叠加文件系统构成,镜像本身都是只读的,加载后会在docker容器最顶层构造一个读写文件系统。我们运行的程序就是在这个读写层上进行的。
修改流程,从底层只读文件系统复制文件,之后在读写层上操作,根据写时复制,会构建一个副本,而本身的只读文件系统还是存在,只不过被隐藏了。

4.2镜像操作

docker images ## 获取镜像列表
镜像会存储子啊 宿主机的/var/lib/docker之内

docker pull # 拉取镜像
镜像是存放在仓库中的,而仓库中存储着很多镜像,除了镜像名之外还有以tag做区分,tag也可以理解为版本
比如我们要拉取特定版本的ubuntu
如果可以的话最好在构建的当前版本打一个latest 版本的标签,这样在拉去的时候可以不用指定版本,更加方便。
docker tag images_id imagesname:version
docker pull ubuntu:12:04
所有拉取包括运行特定镜像都可以以 镜像名:tag来处理
镜像id是唯一的,但是针对同一个进行可以打不通的tag

docker search 镜像名
可以在查找docker hub上的镜像

4.3仓库区分

docker仓库包括用户仓库和顶层仓库,其中用户仓库的命名h是 用户名/仓库名 而顶层仓库是docker公司内部或者合作的镜像提供商给的顶层仓库只有仓库名。
私库操作
如果我们需要将相关镜像推送到私库需要指定给镜像打tag并指定私库名
例子:
docker tag image_id harbo.ultra.com/nlg/sentens

4.4构建镜像

上方我们介绍已定制好的镜像做拉取和其他的相关操作,那么我们将在这章介绍如何构建和管理自己的镜像。
两种方式:
docker commit
编写Dockerfile build

4.4.1docker commit

拉取一个基础镜像 之后运行交互命令,安装一个软件 之后再commit,定义相关信息和提交到某个仓库和对应的tag,这个操作其实就是在当前的容器可写层上将操作的数据提交到镜像层。
docker commit -m “apche” -a “作何” contain_id 仓库:标签

4.4.2 Dockerfile构建镜像

首先 mkdir <\docker_context_dir> 这个目录可以让docker守护进程可以访问到,可以添加进该目录和目录下的所有文件夹和文件到镜像中。
cd <\docker_context_dir>
touch Dockerfile
可以在Dockerfile中运行相关命令来构建需要的镜像
案例:

#Version:1.0
FROM ubuntu:14:04
MAINTAINER JAMES "aaa@...com"
RUN apt-get update & apt-get install -y nginx
RUN echo Hi i am in your container > /usr/share/nginx/hmtl/index.html
EXPOSE 80

构建了一个基于ubuntu系统的安装有nginx镜像,开放端口80.
每个指令都是大写的,指令语言是DSL。
Dockerfile是基于上一层镜像执行一条启动容器运行然后提交成一个新的镜像,之后再基于刚刚的镜像执行下一条指令。
标准格式:
# 注释
FROM 基础镜像
MAINTAINER author email
RUN command
RUN …
EXPOSE port
首先RUN之后的指令是在 /bin/bash -c 之后执行的指令是shell脚本如果不想用,可以用RUN exec编写指令如
RUN [“apt-get”,“install”,"-y",“nginx”]
EXPOSE是告知容器需要用到的端口,但是不会对外提供开放端口,需要在运行容器的时候指定开放端口才可。

之后可以使用docker build -t=“repository:tag” .
指定镜像名称和tag

docker build会在当前目录下找Dockerfile文件去构建 如果存在.dockerignore的文件则会按行匹配文件命名规则,这里面的上下文文件如果匹配上了则不会提交到docker守护进程中。

如果构建成功了有镜像id返回就是我们需要的镜像,如果docker build失败的话,我们可以通过失败的那一步通过docker run -i -t contain_id的形式去执行命令调试。

由于docker build构建过程是存在缓存的,如果构建失败了,如果命令没有变化,会从成功的最后一步开始构建,节省中间流程。如果不想用缓存则可以使用 docker build --no-chache

回顾:如果需要知道镜像是怎么构建出来的 可以使用docker history image_id 来查看。

4.4.5基于新的image来运行容器

比如 docker run -d -p 80 --name=“cname” repository:tag nginx -g “daemon off”

4.5dockerfile指令

CMD 与RUN相似,但是CMD是用于启动容器的指令 而run是运行构建镜像的指令。
CMD指令替代了run中的要运行的指令
docker run image_id:tag 即可如果这里有命令则会覆盖原先的CMD指令
CMD只会有一条生效,如果需要有多条启动命令可以使用supervisor来进行程序启动。
ENTRYPOINT 这个与cmd有点相似,但是CMD容易被覆盖,而EN…不容易被覆盖,我们传递的命令会被ENT当做参数
比如 ENTRYPOINT ["/usr/sbin/nginx"]
然后运行 docker run -d contain_id -g “daemon off” 这个时候 -g "daemon off"会作为 ENTRY…的参数启动。
当然我们也可以通过 --entrypoint 覆盖ENTR…指令
WORKDIR 会为接下来的指令设置工作目录

WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]

/opt/webapp/db 为bundle install 命令执行的工作目录
/opt/webapp rackup命令执行的工作目录
通过 -w可覆盖容器工作目录
ENV:为镜像构建过程设置环境变量
使得之后的命令都能用到这个变量
例子

ENV RVM_PATH /home/rvm
RUN gem install unicorn

另外ENV 一次性也可以指定多个变量
并且这些变量在容器中运行也是有效的
另外我们可以在 docker run -e “AA=/opt/aa” 来指定容器的环境变量但是只有在运行时有用

USER 指定什么用户执行
VOLUME 卷,可在容器之间共享数据
卷的修改立刻生效
卷不会对镜像有影响
卷会一致存在直到没有容器使用它
VOLUME ["/opt/project"]居于此镜像的所有容器都会创建这个一个挂载点
ADD 将构建环境下的文件复制到镜像中
ADD soft /opt/application/soft
ADD的来源文件包括 构建环境上下文的文件或者目录,或者一个url
源文件通过目的地址末尾字符判断类型 如果是/则认定为源文件为目录 反之为文件
如果是归档文件 tar.gz zip 之类的 目的文件会进行uppack操作,并且如果已存在不会做覆盖目的。
ADD会使构建缓存无效,也就是说ADD之后的操作指令都无法使用构建缓存。
默认都是 0:0 uid:gid
COPY copy与add大体相同,但是不同的地方在于copy之复制不会进行解压缩操作,而且只能复制构建上下文的文件,目的地址必须是绝对路径。
LABEL 构建元数据用的
例子:

LABEL version="1.0" type="data contern"

元数据构建最好放在一条指令上,防制构建多个镜像层。
STOPSIGNAL 这个指令是定义docker容器停止的系统调用信号,比如9(ps:必须是系统支持的合法数据),或者SIGNAME中的合法数据比如SIGKILL
ARG 系统构建时的运行数据,
ARG build
ARG web_user=user
如果我们在构建的时候可以通过 docker build --build-arg build=1234 image_name 这里build会赋值 而web_user还是用原来的user,注:build-arg指定的必须是在Dockerfile中使用ARG定义过的参数。
另外docker本身已默认赋值了一些ARG变量我们可以在构建时直接使用
image_1dcl63jj659617qt1re61gao1at7p.png-139.6kB
ONBUILD 为镜像构建添加trigger 触发器
当一个镜像被其他镜像作为基础镜像是,触发触发器,
比如

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src & make

紧跟在FROM之后,
例子:

FROM ubuntu:14:04
RUN apt-get update & apt-get install -y apache2
ENV APACHE_RUN_USER=www_apache
ENV APACHE_RUN_GROUP=www_apache
ENV APACHE_LOG_DIR=/var/log
ONBUILD ADD . /var/www
EXPORSE 80
ENTRYPOINT ["/usr/sbin/apahce2"]
CMD ["-D","FOREGROUND"]

使用docker build的时候就会在当前构建环境将web界面添加到 /var/www让构建变的通用。
比如如果再有一个镜像使用这个镜像 也会使用 ADD . /var/www里面
注意ONBUILD触发器只能继承一次,在子镜像中可以触发,如果是子子镜像就不会再次触发了。

4.6 推送进行到docker hub

docker push username/repository

另外可以通过github在docker hub进行自动构建授权,然后我们可以通过github代码推送,就会完成自动构建的过程。

4.7删除镜像

跟删除容器有点像
docker rmi image_id/name

4.8使用register

一种直接使用docker run registry
通过新的registry我们可以将镜像推送到这里
1.打标签
docker tag image_id registry_addr:port/user/repository
docker push registry_addr:port/user/repository
这个是最简单的部署registry的方式,如果要构建包括认证和管理registry的话,我们可查看registry的doc完成构建。

5 docker之间的相互连接

5.1docker内部连接

ip a show docker0
docker0为docker网卡名称,docker会为容器创建默认子网 172.16~30
而端口则可以映射到宿主机上的端口

docker0是宿主机的名称 veth是容器的名称 每创建一个容器会自动创建网络接口 一端连接docker0一端连接veth

由于docker容器每次启动重新分配,那么ip地址和端口号映射就完蛋了,这样的话太不方便了 ,所以从1.9开始有了后两种方式可以比较方便的使用。

5.2docker networking

1.首先网络可以自定义ip,

docker network create a
docker network inspect net_id
docker run --net=a
这里–net就可以指定刚刚创建的网络
这里的案例是使用networking使用创建一个网络 之后再网络之下创建容器的形式,这样可以通过内网就完成了服务之间的连接。而且容器重启后也会自动更新/etc/hosts下
疑问:那么如果跨宿主机的连接怎么弄? 后续补上,如果不用第三方的网络管理工具,当前在机器中我们的项目是利用端口映射和eureka完成服务将的通信。

5.3docker 连接

–link contain_id:name (ps:这里只要–link就可以连接上所有服务端开放的端口,而且只有–link才能连接上开放的端口)
同样如果跨宿主机该怎么弄
同一台连接:
如果需要跨宿主机 只能用networking 或者swarm

后续再补充一个针对于springcloud服务构建的一个docker服务集群。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值