史上最详细的docker学习手册,请查收!(一)

一、docker入门


1、docker的安装及入门示例


环境准备:docker需要安装在centos7 64位系统上;docker要求系统内核在3.10以上


查看系统内核:


uname -r


安装命令:


yum -y install docker-io



安装完成后,启动命令


service docker start


安装nginx体验


docker run -p 80:80 -d nginx


2、doker的理论概念


什么是docker:


鲸鱼通过身上的集装箱(Container)来将不同种类的货物进行隔离;而不是通过生出很多小鲸鱼(Guest OS)来承运不同种类的货物。Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。


物理机、虚拟机、docker的形象对比


这是物理机: 一栋楼一户人家、独立地基、独立花园。


史上最详细的docker学习手册,请查收!(一)

这是虚拟机:一栋楼包含多套房子,一套房一户人家,共享地基、共享花园,独立卫生间、厨房、宽带


史上最详细的docker学习手册,请查收!(一)


这是docker容器:一套房隔离成多个小空间俗称胶囊公寓,每个胶囊住一个租客,共享地基、花园、卫生间、厨房、宽带等等


史上最详细的docker学习手册,请查收!(一)


  • docker和虚拟机的对比


史上最详细的docker学习手册,请查收!(一)


docker的架构原理


史上最详细的docker学习手册,请查收!(一)


docker引擎


**derver daemon:**docker server是一个守护进程,它可以部署远程也可以部署本地。它包含2部分网络newtwork和磁盘data volumes

REST API: 实现了client和server间的通信交互协议

**CLI(command line interface)????*docker client ,它包含2部分容器和镜像,1个镜像可以创建N个容器(container)


Image: 一个只读的镜像模板。可以自己创建一个镜像也可以从网站上下载镜像供自己使用。


**Container:**由docker client通过镜像创建的实例,用户在容器中运行应用,一旦创建后就可以看做是一个简单的操作系统,每个应用运行在隔离的容器中,享用独自的权限,用户,网络。


**Registry:**镜像仓库,用来存储和管理image镜像,目前主流的仓库有Docker hub、阿里云镜像仓库,也可以自己创建仓库来管理。


史上最详细的docker学习手册,请查收!(一)docker架构


说明:docker client 通过3个命令,先到docker daemon pull拉取images,如果服务端没有,先到仓库拉取,(如果仓库没有你可以build自建images);最后通过run命令创建容器


二、镜像管理


1、什么是镜像


一个只读的模板,就是一个dockerfile,可以在镜像仓库上传或下载

先有镜像,后有容器;并且一个镜像可以创建多个容器。

docker镜像最大的特点:分层结构。最底层是一个base层,也即是一个操作系统层。它还会从base层一层层的叠加生成(什么是层层叠加?例如,安装一个软件,它就会在base层的基础上追加一层。它的好处就是资源共享)。

2、镜像相关命令


查看docker本地的镜像


docker images


搜索一个镜像


docker search mysql


史上最详细的docker学习手册,请查收!(一)


  • INDEX :仓库地址
    NAME :仓库+名称
    STARS :用户的喜欢程度
    OFFICIAL:是否为官方,如果为OK的话代表官方,可信度高,放心使用
    UTOMATED:是否为公开的dockerfile脚本制成的?也即是说dockerfile是否提供。
  • 下载一个镜像
docker pull mysql:5.7


  • 下载完后,查看是否在本地 docker images
  • 删除docker镜像



docker rmi [imageID]
# 如果要删除全部镜像 
docker rmi $(docker images -q)


  • 加速器的配置


#centos的阿里云加速器命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uqxmqcrw.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker


dockerfile


dockerfile概念


dockerfile是一个文本的配置文件,它可以快速创建自定义的镜像,文本内容包含了若干的命令行,并支持#作为注释行,文本格式包含基础镜像FROM,维护者MAINTAINER,操作指令ADD,容器启动后指令等共计4部分


dockerfile文件示例


#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8
FROM java:8

#2.维护者:格式:MAINTAINER <name>
MAINTAINER jackly

#3.镜像的操作指令
# ADD拷贝一个文件到容器中,格式:ADD <src> <dest>
ADD eureka-server-0.0.1-SNAPSHOT.jar  /app/service/eureka/data/app.jar

#告诉docker容器暴露端口,在容器启动的时候,需要通过-p 做端口映射
EXPOSE 8761

#5.配置容器启动后,执行什么命令
ENTRYPOINT ["java","-jar","/app/service/eureka/data/app.jar"]


构建docker镜像

#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号
#注意:其中 .号,代表当前目录下的dockerfile文件
docker build -t registry-jackly/eureka-server:1.0.0 .


查看和运行镜像容器


#查看本地镜像
docker images
#启动镜像
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0


三、镜像仓库管理


1、建设dockerhub官方仓库


  • 什么是镜像仓库
    就是存放镜像的地方
  • 推送镜像到dockerhub(需*)


①、登录 https://hub.docker.com/,创建一个eureka-server仓库
②、本地linux登录docker官方, docker login
③、改镜像的名,(为什么要改?因为docker官方镜像仓库是以 用户名 来命名仓库的)
   docker tag registry-jackly/eureka-server:1.0.0 jacklydocker/eureka-server:1.0.0
④、推送镜像到官方仓库
   docker push jacklydocker/eureka-server:1.0.0
⑤、拉取上传的镜像
   先删除旧镜像:docker rmi jacklydocker/eureka-server:1.0.0
   拉取镜像:docker pull jacklydocker/eureka-server:1.0.0
   创建容器:docker run -d -p 8761:8761 --name=eureka docker.io/jacklydocker/eureka-server:1.0.0


2、建设阿里云docker仓库


  • 推送镜像到阿里云仓库


①、登录阿里云,先创建命名空间,并建个镜像仓库
②、本地linux登录登录阿里云Docker Registry, docker login --username=你的用户名 registry.cn-shenzhen.aliyuncs.com
③、改镜像的名,(为什么要改?因为docker官方镜像仓库是以 用户名 来命名仓库的)
   docker tag 58acc264425c registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
④、推送镜像到阿里云仓库
   docker push registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
⑤、拉取上传的镜像
   docker pull registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0


3、建设本地仓库


  • 为什么需要搭建本地仓库
    (1).节约带宽:因为如果用docker或阿里云官方的仓库走的互联网浪费带宽,而且慢。
    (2).提供资源利用和安全:因为公司内部的镜像,推送到本地仓库,更方便公司内部人员用,而且安全性高。
  • 创建仓库容器


#查找官方仓库
docker search registry
#拉取仓库镜像
docker pull registry
#运行仓库容器
docker run -d -p 5000:5000 \
--restart=always \
--privileged=true \
--name=registry-local-jackly \
-v /date/volume/registry:/var/lib/registry \
registry


推动镜像到本地私有仓库


①、改镜像的名
   docker tag 58acc264425c reg.qxbdocker.com:5000/eureka-server:1.0.0
②、推送镜像到私有仓库(注意:记得改本地hosts:127.0.0.1 reg.qxbdocker.com)
   docker push reg.qxbdocker.com:5000/eureka-server:1.0.0
③、查看搭建仓库的信息
   查看仓库的镜像:
    curl -X GET http://127.0.0.1:5000/v2/_catalog
   仓库仓库某个镜像的版本信息:
    curl -X GET http://127.0.0.1:5000/v2/eureka-server/tags/list
⑤、拉取上传的镜像
    #先删除本地镜像
    docker rmi reg.qxbdocker.com:5000/eureka-server:1.0.0
    #在拉取仓库中的镜像
    docker pull reg.qxbdocker.com:5000/eureka-server:1.0.0


四、容器管理


1、容器的生命周期实践


什么是容器


容器类似于胶囊公寓,它是一个精简版的操作系统,一般容器中只运行一个应用(例如:eureka-server镜像)。


如何创建容器


通过镜像创建容器,通过docker run命令创建。


容器的作用


容器起到了隔离的作用,独享空间、网络等等。


doker命令


docker run --help
    -d, --detach=false         指定容器运行于前台还是后台,默认为false
    -i, --interactive=false    打开STDIN,用于控制台交互
    -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false
    -u, --user=""              指定容器的用户
    -a, --attach=[]            登录容器(必须是以docker run -d启动的容器)
    -w, --workdir=""           指定容器的工作目录
    -c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使用
    -e, --env=[]               指定环境变量,容器中可以使用该环境变量
    -m, --memory=""            指定容器的内存上限
    -P, --publish-all=false    指定容器暴露的端口
    -p, --publish=[]           指定容器暴露的端口
    -h, --hostname=""          指定容器的主机名
    -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录
    --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
    --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
    --device=[]                添加主机设备给容器,相当于设备直通
    --dns=[]                   指定容器的dns服务器
    --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
    --entrypoint=""            覆盖image的入口点
    --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量
    --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口
    --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息
    --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用
    --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
    --net="bridge"             容器网络设置:
                                  bridge 使用docker daemon指定的网桥
                                  host    //容器使用主机的网络
                                  container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源
                                  none 容器使用自己的网络(类似--net=bridge),但是不进行配置
    --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities
    --restart="no"             指定容器停止后的重启策略:
                                  no:容器退出时不重启
                                  on-failure:容器故障退出(返回值非零)时重启
                                  always:容器退出时总是重启
    --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理


docker创建示例


docker run -d -p 5000:5000 \
    --restart=always \
    --privileged=true \
    --name=registry-local-jackly \
    -v /date/volume/registry:/var/lib/registry \
    registry


docker常用命令


#查看正在运行的容器
docker ps
#查看所有的容器(包括已经停止的容器)
docker ps -a
#停止容器
docker stop 容器ID
#强制停止容器
docker kill 容器ID
#启动容器
docker start 容器ID
#重启容器
docker restart 容器ID
#删除已经停止的容器
docker rm 容器ID
#删除正在运行的容器,强制删除
docker rm -f 容器ID


2、如何进入容器内部


  • 进入容器的方式
    有4种方式能进入容器,分别为 exec、docker attach、ssh、nsenter. 这4种都能进入容器,但是最好用最常用的是exec
  • exec命令


docker exec --help
    -d 以后台方式执行,这样,我们执行完这条命令,还可以干其他事情,写脚本最常用
    -e 代表环境变量
    -i 以交互方式运行,是阻塞式的
    -t 分配一个伪终端,这个参数通常与-i参数一起使用,然后在后面跟上容器里的/bin/bash,这样就把我们带到容器里去了。
    -u 指定进入的容器以哪个用户登陆,默认是root

进入容器命令


#启动镜像,若镜像容器已经创建,则通过docker ps -a查询停止的容器id,在通过docker start 容器ID  启动容器
 docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
 #进入容器的相关命令
 docker exec -it eureka sh
 #进入后可以使用ls查看目录(/app/service/eureka/data/app.jar)
 docker exec -it eureka /bin/bash
 docker exec -it eureka pwd
 docker exec -it eureka top


3、容器内容改变后,能否重新生成镜像


使用ll命令验证


①、进入容器: docker exec -it eureka /bin/bash
②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
③、验证ll命令:ll
④、强制删除容器:docker rm -f 容器ID
⑤、启动镜像容器:docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
⑥、进入容器使用ll命令:发现先前修改的实效

修改容器后,重新生成镜像


①、进入容器: docker exec -it eureka /bin/bash
②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
③、验证ll命令:ll
#生成镜像命令
docker commit --help
    -a 用来指定作者
    -c 使用Dockerfile指令来创建镜像
    -m 描述我们此次创建image的信息
    -p 在commit时,将容器暂停
④、重新生成镜像
docker commit -m="add ll" --author="jackly" eureka registry-jackly/eureka-server:2.0.0
⑤、启动新镜像
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0



上一篇:Photoshop为风景照片打造水中倒影教程


下一篇:Photoshop路径工具鼠绘美丽的彩色蝴蝶