Docker使用总结

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
日志服务 SLS,月写入数据量 50GB 1个月
简介: Docker使用总结

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

参考:

Docker 从入门到实践

podman简介

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
6月前
|
Linux Go Docker
Docker介绍(二)
Docker是基于Go语言的开源容器平台,利用Linux内核的namespace、cgroups和UnionFS等技术实现在Linux上运行。它分为社区版(Docker-CE)和企业版(Docker-EE),在CentOS上可安装Docker-CE。Docker的核心技术包括镜像,它是包含应用及环境的可执行文件,用于创建容器。常用镜像操作有搜索、查看、下载、删除、保存备份、导入、重命名和检查。
|
6月前
|
Java Linux 虚拟化
|
6月前
|
存储 Java Linux
|
数据可视化 应用服务中间件 nginx
|
7月前
|
Linux Go 开发者
Docker(一):认识Docker
Docker(一):认识Docker
|
7月前
|
存储 运维 Linux
|
Docker 容器
docker
docker
78 1
|
安全 Linux Docker
认识 Docker 的世界
Docker 简介:Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。 Docker 是在 GitHub 上开发的 Moby 开源项目的一部分。 Docker 公司,位于旧金山,是整个 Moby 开源项目的维护者。Docker 公司还提供商业版和社区版。Docker运行时与编排引擎:Docker 引擎是用于运行和...
253 1
认识 Docker 的世界
|
Kubernetes Linux 持续交付
什么是Docker?
什么是Docker?
146 0
|
存储 运维 关系型数据库
Docker(2)
Docker(2)
下一篇
DataWorks