Below you will find pages that utilize the taxonomy term “docker”
November 23, 2021
利用代理拉取docker镜像
"在日常开发中经常会遇到有些镜像在 gcr.io 仓库,其仓库是google提供的,由于国内网络环境的复杂性是无法拉取到这些镜像的,这时候就需要我们想一些办法来实现拉取了。\n这里给出了两种解决方法,一种是直接使用代理,这种可以直接拉取远程镜像到本地。另一种是通过中转的方法,先找一个可以直接拉取到镜像的网络,先将存储到本地,然后再转镜像上传到三方国内可以访问的镜像,如我们最常用镜像 https://hub.docker.com。\n代理方式 使用代理方法的时候,如果通过直接设置 http_proxy 和 https_proxy 这两个环境变量是不可行的。如果是k8s环境的话,可能会使用到 containerd 运行时,这时可能还需要设置 crictl 配置,因此下面将分别介绍这个软件的配置方式。\n如果k8s运行时,使用的是 Docker Engine ,则可以通过 docker 命令管理镜像;如果使用的是 containerd运行时,则需要通过 crictl 命令管理镜像。\n不同运行时需要不同的管理客户端,因此下面我们将一下针对这两个软件配置的不同代理配置。 …"
September 13, 2021
利用 docker buildx 构建多平台镜像
"什么是 docker buildx Docker Buildx是一个CLI插件,它扩展了Docker命令,完全支持Moby BuildKit builder toolkit提供的功能。它提供了与docker build相同的用户体验,并提供了许多新功能,如创建作用域生成器实例和针对多个节点并发构建。\nDocker Buildx包含在Docker 19.03中,并与以下Docker Desktop版本捆绑在一起。请注意,必须启用“实验特性”选项才能使用Docker Buildx。\nDocker Desktop Enterprise version 2.1.0 Docker Desktop Edge version 2.0.4.0 or higher\n用法 Usage: docker buildx [OPTIONS] COMMAND Extended build capabilities with BuildKit Options: --builder string Override the configured builder instance Management Commands: …"
December 31, 2019
使用Dockerfile 多阶段构建Golang 应用
"docker在开发和运维中使用的场景越来越多,作为开发人员非常有必要了解一些docker的基本知识,而离我们工作中最近的也就是对应用的docker部署编排了,小到一个dockerfile, docker-compse文件的编写,大到k8s的管理。这里我们以 golang应用为例讲解一些Dockerfile的基本用法,在ci/cd中经常用到这些知识。\n前提 项目清单:\ndrwxr-xr-x 9 sxf staff 288 12 31 16:13 . drwx------@ 17 sxf staff 544 12 31 14:59 .. -rw-r--r-- 1 sxf staff 14 12 31 16:09 .dockerignore drwxr-xr-x 14 sxf staff 448 12 31 16:21 .git -rw-r--r-- 1 sxf staff 467 12 31 16:08 Dockerfile -rw-r--r-- 1 sxf staff 11 12 31 15:01 README.md -rw-r--r-- 1 sxf staff 84 12 31 …"
July 26, 2019
docker exec 命令原理
"我们经常使用 docker exec 命令进入到一个容器里进行一些操作,那么这个命令是如果进入到容器里的呢?想必大家都知道用到了Namespace来实现,但至于底层实现原理是什么,想必都不是特别清楚吧。\n我们知道容器的本质其实就是一个进程,每个进程都有一个Pid,至于容器的Pid值可以通过 docker inspect container_id 来查看,我们这里是一个Python应用容器,我们看一下他的 Pid值\ndocker inspect --format \u0026#39;{{ .State.Pid }}\u0026#39; 4ddf4638572d 25686 而每个进程都有自己的Namespace,你可以通过查看宿主机的 proc 文件,看到这个 25686 进程的所有 Namespace 对应的文件\nls -l /proc/25686/ns total 0 lrwxrwxrwx 1 root root 0 Aug 13 14:05 cgroup -\u0026gt; cgroup:[4026531835] lrwxrwxrwx 1 root root 0 Aug 13 14:05 ipc -\u0026gt; …"
July 26, 2019
docker中的命名空间
"Namespace 的作用是“隔离”,它让应用进程只能看到该Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。\n命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。\n在docker中一共有以下几个命名空间,每个Namespace的发挥着不同的作用。\npid 命名空间 不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。在同一个Namespace中只能看到当前命名空间的进程。所有的 LXC 进程在 Docker 中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。\nnet 命名空间 有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, …"
July 13, 2019
docker容器调试利器nicolaka/netshoot
"背景 在日常工作中,我们一般会将容器进行精简,将其大小压缩到最小,以此来提高容器部署效率,参考小米云技术 – Docker最佳实践:5个方法精简镜像。但有一个比较尴尬的问题就是对容器排障,由于容器里没有了我们日常工作中用到许多排障命令,如top、ps、netstat等,所以想排除故障的话,常用的做法是安装对应的命令,如果容器过多的话,再这样搞就有些麻烦了,特别是在一些安装包源速度很慢的情况。\n解决方案 今天发现一篇文章(简化 Pod 故障诊断:kubectl-debug 介绍)介绍针对此类问题的解决方案的,这里介绍的是一个叫做 kubectl-debug 的命令,由国内知名的PingCAP公司出品的,主要用在k8s环境中的。我们知道容器里主要两大技术,一个是用cgroup来实现容器资源的限制,一个是用Namespace来实现容器的资源隔离的)。(kubectl-debug 命令是基于一个工具包() 来实现的,其原理是利用将一个工具包容器添加到目标容器所在的Pod里,实现和目标容器的Network Namespace一致,从而达到对新旧容器进程的相互可见性,这样我们就可以直接在目标容器里 …"
July 2, 2019
docker容器 Exited (137)错误代码
"最近要搭建es集群,由于刚接触es不久,直接使用的docker构建,发现当用两个容器搭建好集群时,再添加新的es容器节点时,总是出现其它容器被kill的现象,查看容器日志未发现任何错误信息,导致一段时间非常的迷茫。\n起始认为是配置不当引起了,于是一直在配置这方面找问题,网上的有些教程是直接在物理机器上或者虚拟机上进行部署,而自己的环境是docker, 通过 docker-compose 来部署的,\u0008环境有些差异。\n有网友提醒有可能是由 OOM 引起的问题,因为代码是137, 使用命令 “docker inspect 容器ID” 查看了一下容器, status列显示”OOMKilled\u0026quot;: false” ,所以从这里查看的话,并非是 OOM 引起的,起初个人分析容器的启动过程,是在启动一个容器时,dockerd应该先检查内存是否足够,如果不足够的话,则启动新窗口失败才对,而不是先将已存在的窗口killed,再去启动新容器,所以仍将OOM的原因排除掉了。\n后来\u0008发现一篇文章 介绍到这个和 docker for mac 分配的内存大小有关系,试着将给 docker 分配的内存调整 …"
January 26, 2019
docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法
"今天利用docker容器创建mysql8.0的时候(window系统),指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了。\n创建命令:\n$ docker run -d --name mysql81 -v /e/container/mysql/mysql81/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 33081:3306 mysql 错误提示:\n$ docker logs mysql81 2019-01-26T03:05:42.567230Z 0 [Warning] [MY-011070] [Server] \u0026#39;Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it\u0026#39; is deprecated and will be removed in a future release. …"
January 15, 2019
docker build . 命令后面的.是什么意思
"今天来公司自己构建了一个Dockerfile,放在一个经常用到的项目目录里,内容如下:\n# This is a comment FROM ubuntu:14.04 MAINTAINER Docker Newbee \u0026lt;newbee@docker.com\u0026gt; RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatra 然后执行\nsudo docker build -t \u0026#34;cfanbo/test:v2\u0026#34; . 发现在构建的时候发送给 docker daemon 竟然有4G多,超极大。首先的第一反映出问题了。一个ubuntu镜像也没有这么大呀,况且现在还没有开始从远程pull 镜像呢。\n那到底什么情况了呢?经过一翻搜索,发现在docker build . 的时候,会将当前目录里的内容发送给 docker daemon。只需要加一个 .dockerignore 文件,将其它内容排除掉就可以了,类似于git中的.gitignore文件的作用。\n后面就想通 …"
December 29, 2018
windows下更新docker源(aliyun)
"每个aliyun账号都有一个专属的镜像源\n我这里安装的是 Docker Toolbox 软件,更新docker源有两种情况,一种是你还没有创建过Docker Machine,另一种是你已经创建过了Docker Machine。\n一、未安装过 创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。 $ docker-machine create –engine-registry-mirror=https://xxxx.mirror.aliyuncs.com -d virtualbox default\n查看机器的环境配置,并配置到本地。然后通过Docker客户端访问Docker服务。 $ docker-machine env default $ eval “$(docker-machine env default)” $ docker info\n这里 xxxx 是您的专有加速器地址\n二、已安装过\n登录已创建的Docker VM $ docker-machine ssh default $ sudo vi …"
July 10, 2018
使用Dockerfile构建Swoole+php7环境
"FROM php:7.2.7-cli RUN apt-get update \u0026amp;\u0026amp; apt-get install -y libmemcached-dev zlib1g-dev RUN pecl install redis-4.0.1 \u0026amp;\u0026amp; pecl install swoole-4.0.1 \u0026amp;\u0026amp; pecl install memcached-3.0.4 \u0026amp;\u0026amp; pecl install xdebug-2.6.0 \u0026amp;\u0026amp; docker-php-ext- enable redis swoole memcached xdebug COPY . /usr/src/myapp WORKDIR /usr/src/myapp CMD [ \u0026#34;php\u0026#34;, \u0026#34;-m\u0026#34; ] 构建完环境后,使用方法见: https://blog.haohtml.com/archives/17925 …"
July 5, 2018
一个docker-compose微服务脚本,自用
"容器为swoole+php7\ndocker-compose.yml\nversion: \u0026#39;3.6\u0026#39; services: redis: image: redis web: image: cfanbo/swoole4_php7:v1 depends_on: - redis links: - redis volumes: - /Users/sxf/sites/msgserve:/usr/src/myapp command: \u0026#34;php /usr/src/myapp/src/wx_push_server.php start\u0026#34; 对于 wx_push_server.php文件里redis的主机地址应该写成docker-compose配置文件里的容器服务名(redis)"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"//创建一个独立的容器目录\nmkdir docker-db cd docker-db 前提、创建 docker Compose 配置文件 #vi docker-compose.yml 文件,内容如下\nversion: \u0026#39;3.6\u0026#39; services: db: image: hub.c.163.com/library/mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress MYSQL_USER: root MYSQL_PASSWORD: 123456 MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34; ports: - \u0026#34;33061:3306\u0026#34; image也可以直接写mysql:5.7 或者mysql:latest,不指定获取地址。 上面的 ports 这一块,是指宿主机端口号:容器端口号。在使用的时候,直接访问本机的 33061 端口即可。端口号前也可以指定一个固定的IP 地址。 Compose …"
February 8, 2018
Docker Machine 简介
"一句话概括的话就是 Docker Machine是一个可以方便对多个宿主服务器中的多个容器进行管理的工具。\nDocker 与 Docker Machine 的区别 https://www.cnblogs.com/sparkdev/p/7066789.html\nDocker Machine 工具出现的意义 https://www.2cto.com/net/201707/660864.html\nDocker Machine 用法 http://www.linuxidc.com/Linux/2017-06/145232.htm\nDocker Machine 命令 http://blog.csdn.net/warren_1992/article/details/51451522\nMac平台上Docker安装与使用 http://blog.csdn.net/warren_1992/article/details/51451522"
February 8, 2018
windows平台在dos下执行docker pull 命令出错
"这里docker Machine 是安装和管理 Docker 的工具(用来代替Boot2Docker,对于个人玩的话,不建议使用docker Machine,毕竟多了一个虚拟层,不如直接使用当前物理机器作为容器的宿主机)\n$ docker pull gitlab/gitlab-ce:latest Warning: failed to get default registry endpoint from daemon (error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the …"
March 15, 2016
给一个正在运行的Docker容器动态添加Volume(转)
"之前有人问我Docker容器启动之后还能否再挂载卷,考虑mnt命名空间的工作原理,我一开始认为这很难实现。不过现在我认为是它实现的。\n简单来说,要想将磁盘卷挂载到正在运行的容器上,我们需要:\n使用nsenter将包含这个磁盘卷的整个文件系统mount到临时挂载点上; 从我们想当作磁盘卷使用的特定文件夹中创建绑定挂载(bind mount)到这个磁盘卷的位置; umount第一步创建的临时挂载点。 注意事项 在下面的示例中,我故意包含了$符号来表示这是Shell命令行提示符,以帮助大家区分哪些是你需要输入的,哪些是机器回复的。有一些多行命令,我也继续用\u0026gt;。我知道这样使得例子里的命令无法轻易得被拷贝粘贴。如果你想要拷贝粘贴代码,请查看文章最后的示例脚本。\n详细步骤 下面示例的前提是你已经使用如下命令启动了一个简单的名为charlie的容器:\n$ docker run --name charlie -ti ubuntu bash 我们需要做的是将宿主文件夹 /home/jpetazzo/Work/DOCKER/docker 挂载到容器里的 /src 目录。好了,让我们开始吧。 …"
February 2, 2016
利用 Dockerfile 来创建镜像
"使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。\n新建一个目录和一个 Dockerfile\n$ mkdir sinatra $ cd sinatra $ touch Dockerfile Dockerfile 中每一条指令都创建镜像的一层,例如:\n# This is a comment FROM ubuntu:14.04 MAINTAINER Docker Newbee RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatra Dockerfile 基本的语法是\n使用#来注释 FROM 指令告诉 Docker 使用哪个镜像作为基础 接着是维护者 MAINTAINER 的信息 RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件 编写完成 Dockerfile 后 …"
February 2, 2016
docker安装入门篇
"一、下载镜像 image 可以使用 docker pull 命令来从仓库获取所需要的镜像。\n下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像。\n$ sudo docker pull ubuntu:12.04 Pulling repository ubuntu ab8e2728644c: Pulling dependent layers 511136ea3c5a: Download complete 5f0ffaa9455e: Download complete a300658979be: Download complete 904483ae0c30: Download complete ffdaafd1ca50: Download complete d047ae21eeaf: Download complete 下载过程中,会输出获取镜像的每一层信息。\n该命令实际上相当于\n$ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务 …"
February 2, 2016
docker常用命令
"官方命令: https://docs.docker.com/reference/\n1. 查看docker信息(version、info) # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2. 对image的操作(search、pull、images、rmi、history) # 检索image(sudo docker pull ubuntu:12.04,该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。) $docker search image_name[:tag] # 下载image $docker pull image_name # 列出镜像列表; -a, --all=false Show all images; --no-trunc=false Don\u0026#39;t truncate output; -q, …"
February 2, 2016
docker与vm之间的最基本的区别
"5分钟弄懂Docker! http://www.csdn.net/article/2014-07-02/2820497-what%27s-docker\nDocker入门与实践: https://www.gitbook.com/book/yeasy/docker_practice\n在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。\n下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。\nVirtual Machines是由虚拟机管理程序来实现对 虚拟机 的管理,而docker是用docker Engine来实现对 应用 的管理。可以理解为一个套硬件的管理,一个是软件的管理。\n对比传统虚拟机总结 基本概念 Docker 包括三个基本概念\n镜像(Image) 容器(Container) 仓库(Repository) 理解了这三个概念,就理解了 Docker 的整个生命周 …"
June 13, 2015
Dev with Vagrant and Docker
"前言 为了在团队里搭建统一的本地开发环境,最近花了点时间用了下vagrant和docker,在此做个记录, 这也算一个DevOps的实践。\nVagrant介绍 Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。\n我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。\n以上介绍直接抄自网络,我觉得介绍的很到位。\n「注意点:」\nvagrant up命令执行后,如果看到下面的错误信息,则需要安装另外一个工具:\n[default] The guest additions on this VM do not match the installed version of VirtualBox! In most cases this is fine, but in rare cases it can prevent …"