一、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引擎
**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 client 通过3个命令,先到docker daemon pull拉取images,如果服务端没有,先到仓库拉取,(如果仓库没有你可以build自建images);最后通过run命令创建容器
二、镜像管理
1、什么是镜像
一个只读的模板,就是一个dockerfile,可以在镜像仓库上传或下载
先有镜像,后有容器;并且一个镜像可以创建多个容器。
docker镜像最大的特点:分层结构。最底层是一个base层,也即是一个操作系统层。它还会从base层一层层的叠加生成(什么是层层叠加?例如,安装一个软件,它就会在base层的基础上追加一层。它的好处就是资源共享)。
2、镜像相关命令
查看docker本地的镜像
docker images
搜索一个镜像
docker search mysql
- 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