Docker 简介
什么叫Docker?
Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。也就是说Docker跟Vmware等虚拟机软件相比,它是开源的。
Docker 名词解释
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
层(Layer):镜像是由多个文件系统(只读层)叠加而成, 每个层仅包含了前一层的差异部分。 当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个可写层。容器上所做的任何更改,譬如新建文件、更改文件、删除文件,都将记录与可写层上。
Docker的技术组件
一个原生的Linux容器格式,Docker中称为libcontainer
Linux内核的命名空间(namespace),用于隔离文件系统、进程和网络
文件系统隔离:每个容器都有自己的root系统
进程隔离: 每个容器都运行在自己的进程环境中
网络隔离: 容器间的虚拟网络接口和IP地址都是分开的
资源隔离与分组: 使用cgroups(即 control group,Linux的特性之一)将CPU和内存之类的资源独立分配给每个Docker容器
写时复制: 文件系统都是通过写时复制创建的,这就意味着文件系统是分层的、快速的,而且占用的磁盘空间更小
日志:容器产生的STDOUT、STDERR和STDIN这些IO流都会被收集并计入日志,用来进行日志分析和故障排错。
交互式shell: 用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式的shell
其中:STDOUT为标准输出流,STDERR为错误输出流,STDIN为标准输入流
下面我们来介绍docker指令的使用
Dockerfile -t
ADD指令
是将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件 拷贝到镜像中。
其格式是: ADD 源路径 目标路径
ADD . /cnc/run
ADD /prometheus/prometheus-jmx-config.yaml /cnc/run/prometheus-jmx-config.yaml ADD /prometheus/jmx_prometheus_javaagent-0.13.0.jar /cnc/run/jmx_prometheus_javaagent-0.13.0.jar
Dockerfile 编写规范
#引用基础镜像 FROM ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8:1.0 #记录作者信息 MAINTAINER jiangguilong jiangguilong@gamioo.io #将本地的nginx.tar.gz 包添加至/usr/local/目录,tar.gz 会自动解压,根据自身需求定制 ADD nginx.tar.gz /usr/local #创建目录 RUN mkdir -p /data/server # 对外暴露9527端口 EXPOSE 9527 #安装常用软件或者依赖软件 RUN yum install lrzsz -y RUN yum install vim -y #创建环境变量 ENV NACHOS_IP=${NACHOS_IP} \ ZONE_ID=${ZONE_ID} \ DEPLOY_ENV=${DEPLOY_ENV} ENTRYPOINT ["/bin/bash", "start.sh"]
docker 指令
运行容器:
docker run --name=nginx -p 8099:80 -v /tmp:/tmp -d nginx:alpine docker run -it --rm nginx:alpine sh
–name 容器名称
-p 端口映射
-v 磁盘映射
-d 以守护进程运行
-it 运行后获得一个交互终端
–rm 实例退出后,直接删除容器实例(无需执行 docker rm 清理)。请注意:如果程序运行失败导致进程退出,实例亦会被清除。
镜像后面的 “sh”:表示需要运行的容器内的命令,如果没有具体的命令,会运行 Dockerfile 里面指定的 cmd 或者 entrypoint 等命令。
docker version systemctl status docker #获取docker 的一堆信息,比如镜像的磁盘位置 Docker Root Dir: /home/docker docker info #拉取镜像 docker pull docker pull 下来的命令都默认存在 /var/lib/docker/文件夹下
#查看本地镜像,主要是找到image ID,后面要用
docker images REPOSITORY TAG IMAGE ID CREATED SIZE ccr.ccs.tencentyun.com/ooxx/kona-jdk8 1.0 88e47d5b009a 2 months ago 569MB
登陆自己的docker 私人仓库
sudo docker login --username=100014139498 ccr.ccs.tencentyun.com
制作镜像
docker build -f Dockerfile -t ccr.ccs.tencentyun.com/jiangguilong/gamioo:1.0 robot
或者可以导入镜像
docker build -t yourimage .
-t 是标签,通常,标签的组成是 镜像地址/命名空间/镜像名称:版本号 。
docker load -i tcaplusdb-local-3.51.1.tar.gz
如果制作出来的镜像有问题,可以把docker镜像保存到本地
docker image save -o robot.tar ccr.ccs.tencentyun.com/jiangguilong/gamioo:1.0
删除过多的镜像,如果强制删除要加-f
docker rmi a3dd80a05a57 Untagged: ccr.ccs.tencentyun.com/jiangguilong/gamioo:5.0 Untagged: ccr.ccs.tencentyun.com/jiangguilong/gamioo@sha256:5c38c45520b5dd0a8d3451a23c7764473b4728edfb2ef8122e551c92e5d494a1 Deleted: sha256:a3dd80a05a57b9abdb0b1e21f3f84647f4e041f85a0f9aeec798794f71a0ec8b Deleted: sha256:defd57fbbd2c35682a8aa61bf421e0628c4ccfcdd6ed22ad1938538826b871fd Deleted: sha256:36062a72f42151cc22aefd75540fecbe37523f0a47feb03ce2e1b7a621efd154
如果要删除同样image ID下的镜像时
docker rmi training.tencentcloudcr.com/xyzshop/product:1.0
删除所有none镜像
docker rmi `docker images | grep '<none>' | awk '{print $3}'`
$3指打印第三列的数据,也就是镜像的id。
如果要定时删除过期镜像,可以提供个脚本
#!/bin/bash #用于删除过期的镜像数据 for i in $(## 查看cnc-game镜像的,保留最近10条数据,提取出镜像id docker images | grep -v "IMAGE" | grep 'cnc-game' | tail -n +10 | awk '{print $3}' ); do { docker rmi -f $i &>/dev/null ##删除镜像 echo "docekr delete $i complete" } & done wait echo -e "\e[1;31mdelete complete \e[0m"
打上远程仓库标签
#sudo docker tag [ImageId] ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8:[tag] sudo docker tag 88e47d5b009a ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8:1.0
推送至镜像仓库
#sudo docker push ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8:[tag] sudo docker push ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8:1.0 The push refers to repository [ccr.ccs.tencentyun.com/jiangguilong/kona-jdk8] d76a4ac4667b: Pushed 08fc1ae4f140: Pushed 2683371c0f7f: Pushed 174f56854903: Pushed 1.0: digest: sha256:7f5352ffcce1e21e5056c747c258ef7a87287697964b4225de624546dbed1885 size: 1161
到后台确认:
查看镜像历史
docker history 8e7f2f9cafba --no-trunc=true IMAGE CREATED CREATED BY SIZE COMMENT fd7a89d6641f 34 minutes ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/bash" "… 0B a94521afcf87 34 minutes ago /bin/sh -c #(nop) ADD dir:9f2bc86807842d3d57… 22.2MB 3d204876ff8e 11 hours ago /bin/sh -c #(nop) MAINTAINER jiangguilong j… 0B 88e47d5b009a 2 months ago /bin/sh -c #(nop) ENV JAVA_HOME=/opt/java/T… 0B 2ff8c2c35c44 2 months ago /bin/sh -c #(nop) ADD file:0db09375a72868034… 230MB da52ac2f60d7 2 months ago /bin/sh -c mkdir -p /opt/java/ 0B f22ea73f6d52 2 months ago /bin/sh -c #(nop) ENV JAVA_VERSION=jdk8u272… 0B cb133e52af7a 2 months ago /bin/sh -c yum install -y tzdata openssl cur… 135MB af2b8e849654 2 months ago /bin/sh -c #(nop) ENV LANG=en_US.UTF-8 LANG… 0B 8652b9f0cb4c 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 7 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 7 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
获取容器/镜像的metadata元数据,这里能看到所有信息
docker inspect ccr.ccs.tencentyun.com/jiangguilong/gamioo:19.0
查看docker的一些硬件指标
docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 773495d3e25a k8s_fluentbit-logging_gamesvr-1-658c94cf6d-wm2dp_gamioo-demo_82230c18-3b3f-4226-a990-91ac3b4847e5_0 0.00% 1.006GiB / 7.638GiB 13.17% 0B / 0B 2.74MB / 384MB 3 59f519df0877 k8s_-gamesvr-1_gamesvr-1-658c94cf6d-wm2dp_gamioo-demo_82230c18-3b3f-4226-a990-91ac3b4847e5_0 1.82% 1.089GiB / 7.638GiB 14.26% 0B / 0B 0B / 0B 67 c74a33316b17 k8s_POD_gamesvr-1-658c94cf6d-wm2dp_gamioo-demo_82230c18-3b3f-4226-a990-91ac3b4847e5_0 0.00% 40KiB / 7.638GiB 0.00% 0B / 0B 0B / 0B 1
查看正在运行的容器
docker ps --no-trunc
查看所有的容器
docker ps -a --no-trunc
docker ps -a // -a 表示包含没有启动成功的容器,看到的第一列就是dockerid
通过上述命令,可以查看容器镜像或实例的名字和 ID,名字和 ID 都可以作为标识符用于操作相应资源。
查看容器详情:
docker inspect nginx
nginx 是容器名称,也可以使用 容器ID。
查看日志
docker logs nginx docker logs nginx -n 200 docker logs nginx -f
-n 从尾部开始数,需要显示的行数。
-f 持续追踪日志。
docker logs --tail 10 -f dockerid //一直看最后十行
如果要一次性输入则,替换一下jaegertracing,各种应用就是你要的了
docker logs --tail 10 -f $(docker ps | grep jaegertracing | awk -F ' ' '{print $1}')
停止运行一个容器
docker stop 1712268da898 docker stop nginx
启动一个未运行的容器实例
docker start nginx
停止了还要删除。,删除镜像实例:
docker rm 1712268da898 docker rm nginx
删除镜像:
docker rmi nginx:alpine
Docker修改默认数据目录Docker Root Dir
docker 默认数据目录 Docker Root Dir 是 /var/lib/docker,可通过 #docker info命令查看Docker Root Dir值核实
1、确保停止docker服务 # systemstl stop docker.service 2、修改/etc/docker/daemon.json文件值,文件不存在需手动创建 # vim /etc/docker/daemon.json 新增以下信息: { "data-root": "/opt/docker/data" } 3、启动docker服务# systemstl start docker.service 或者热更新,systemctl daemon-reload 4、#docker info 验证Docker Root Dir的值 是否已修改为/opt/docker/data
对于一个已经启动的容器,可以使用下面的命令进入容器终端 或者 执行某个指令。,进入容器 661d2fb17616 为容器ID
docker exec -it 661d2fb17616 /bin/sh docker exec -it nginx sh -c "(bash || ash || sh)" docker exec nginx sh -c "ls /tmp" docker exec -it component /bin/sh
重启 容器
docker restart 661d2fb17616
docker-compose help docker-compose restart //重启 docker-compose down // docker-compose up -d
启动docker
远程调用
ssh root@10.10.40.36 "bash -x /opt/shell/stop.sh ooxx-game" ssh root@10.10.40.36 "bash -x /opt/shell/restart.sh ooxx-game 0.4.49-master"
stop.sh
name=$1 value=`docker ps -a |grep $name|awk '{print $1}'` if [[ ${value} ]]; then #if [ ${value}x == ""x ]; then docker rm -f ${value} echo "do something" else echo "nothing to exec" fi
restart.sh内容如下
name=$1 tag=$2 docker run -d --name dir -e BUS_ID=1.0.1.1 -e TZ=Asia/Shanghai -e PROC_NAME=dirsvr -p 8087:8087 -p 9528:9528 -v /opt/docker/config/config.yml:/cnc/run/dirsvr/config/config.yml -w /cnc/run/dirsvr ccr.ccs.tencentyun.com/gamioo-demo/ooxx-game:$tag dev http://10.10.40.35 1.0.1.1 config/config.yml
加上–name的好处是,stop 和rm时会很方便,通过名字找到就行
docker stop dir docker rm dir
docker启动后,在母机进程里看得到
docker 端口占用后,从母机上也能看到,但代表的知识container对端口的占用
从hub.docker.com 中pull下来的镜像,可以先docker images 看一下,然后给镜像打成自己的库的tag标签,再上传
docker tag blueking/bk-ci:latest jiangguilong2000/bk-ci:latest docker push jiangguilong2000/bk-ci:latest
手工启动一个docker 镜像时用如下的方式:
docker run --network=host -d -v /opt/svn/csvn/data/conf/svn_access_file:/gamioo/run/svn_access_file -v /opt/svn/csvn/data/conf/svn_auth_file:/gamioo/run/svn_auth_file -w /gamioo/run shtcr.tencentcloudcr.com/gamioo/platform-component:dev-0.5.610.0 dev 10.100.64.19:8848 512M
如果要执行远程部署,则按照以下的脚本:
ssh root@10.10.40.74 "docker run --network=host --name component -d -v /opt/svn/csvn/data/conf/svn_access_file:/gamioo/run/svn_access_file -v /opt/svn/csvn/data/conf/svn_auth_file:/gamioo /run/svn_auth_file -w /gamioo/run shtcr.tencentcloudcr.com/gamioo/platform-component:dev-0.5.633.0 dev 10.100.64.19:8848 512M"
–network=host 是指用母机的IP,这包含了下载远程镜像库并运行的功能。
当容器起不来时,可以把启动参数改成 ENTRYPOINT [“/bin/sh”,“-c”,“sleep 600000”]
让你可以进容器排查问题
判断某个容器是否在运行中
value=`docker ps |grep ${APP}|awk '{print $1}'` if [[ ${value} ]]; then echo "stop and remove docker" `docker stop ${value}` `docker rm ${value}` else echo "no need to stop docker" fi
其中${APP} 是某个容器的名称,比如nginx,component 等
Q&A:
1.docker: invalid reference format.
有各种原因会导致这个问题,我遇到的问题,是因为ssh root@10.10.40.74 “some command”,这里的双引号一开始写成了单引号
2.程序因为内存溢出或者其他原因导致崩溃时,会丢失dump文件,怎么办?
可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
echo "/var/lib/docker/corefile/core.%h.%e.%p.%t" > /proc/sys/kernel/core_pattern
如何使用yum安装docker?
1.下载Docker依赖的环境:想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖JDK一样
yum install -y yum-utils device-mapper-persistent-data lvm2
指定Docker镜像源:默认下载Docker会去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置成功的话返回:
Loaded plugins: fastestmirror, langpacks adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
更新yum缓存
yum makecache fast
安装docker-ce(社区版)
yum -y install docker-ce
启动docker服务
systemctl start docker
设置开启自启动
systemctl enable docker
参考: