东东东 陈煜东的博客

标签存档: Docker

docker 容器自定义 hosts 网络访问

在搭建 Drone CI 服务的时候,拉取git代码出现了网络不通。

+ git init
Initialized empty Git repository in /drone/src/testgit.com/root/demo1/.git/
+ git remote add origin http://testgit.com:10080/root/demo1.git
+ git fetch --no-tags origin +refs/heads/master:
fatal: unable to access 'http://testgit.com:10080/root/demo1.git/': Couldn't resolve host 'testgit.com'
exit status 128

也是到 Drone 的论坛问了 http://discourse.drone.io/t/help-git-clone-with-custom-extra-hosts/217。 看来需要自己设置网络问题,没有办法通过 docker-compose.yml 文件来进行设置。

普通的 Docker 容器解决方案

在 docker-compose.yml 中增加 extra_hosts 关键字就可以将数据写入到容器的 /etc/hosts

version: '2'

services:
  drone-server:
    image: drone/drone:latest
    ports:
      - 8100:8000
    extra_hosts:
      - "mygit.com:10.123.123.130"
    volumes:
      - ./drone:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_DEBUG=true

Drone CI 的情况

Drone CI这个情况比较麻烦。是在Drone agent容器里面又启动了一个容器,这个时候没有关于extra_hosts设置给子容器。于是子容器无法访问特定的域名。

修改 hosts 文件失败

本来想设置添加一个 hosts 文件到镜像中的。但是发现一只失败,无法写入成功。

FROM plugins/git

ADD ./hosts /etc/
RUN cat /etc/hosts

不过这条路走失败了。

hosts文件其实并不是存储在Docker镜像中的,/etc/hosts, /etc/resolv.conf/etc/hostname,是存在/var/lib/docker/containers/(docker_id)目录下,容器启动时是通过mount将这些文件挂载到容器内部的。因此如果在容器中修改这些文件,修改部分不会存在于容器的top layer,而是直接写入这3个文件中。容器重启后修改内容不存在的原因是每次Docker在启动容器的时候,Docker每次创建新容器时,会根据当前docker0下的所有节点的IP信息重新建立hosts文件。也就是说,你的修改会被Docker给自动覆盖掉。

摘录自:https://wongxingjun.github.io/2016/04/06/Docker%E4%BF%AE%E6%94%B9hosts/

问了同事,一般很多容器的做法是,通过将hosts 文件写入容器,然后在容器启动后, cat /data/hosts > /etc/hosts到,然后再执行命令。

我觉得这个方法不适合我,因此我重新寻找新的方法。后面找到了利用 DNS 服务来规避。

搭建 dnsmaq DNS 服务

将需要配置的 hosts 写入到 /etc/hosts 中。

在虚拟机或者特定服务安装 dnsmaq 服务。

yum install dnsmasq -y

touch /etc/dnsmasq.hosts

# 重启
service dnsmasq restart

# 测试一下是否可以查询到域名
dig @127.0.0.1 testdomain.com

使用 Docker 的 DNS 解决

vim /etc/docker/daemon.json

{
    "dns": ["10.123.12.14", "8.8.8.8"]
}

将刚刚的 DNS 服务器 IP 写入到配置中,追加一个字段 dns。如果还有其他的 DNS 服务器,那么就写入在数组中写入其他的 IP。

重启一下 Docker 服务。

service docker restart

Docker 容器测试网络

这个是我的容器
docker run --rm -e DRONE_REMOTE_URL=http://mydomain.com:10080/root/demo1.git plugins/git

或者
docker run busybox nslookup google.com

参考文章

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: docker 容器自定义 hosts 网络访问 – https://www.chenyudong.com/archives/docker-custom-hosts-network-via-dns.html

分类: DevOps

利用 Docker 镜像 gogs 搭建一个私有的 git 服务

本文是为了构建一个私有的持续集成服务而准备的。

利用 Docker 来方便构建,不怕环境错乱,同时也帮忙配置好了一些东西。

Docker 安装准备

需要有一个 Docker 环境, 简单的提及一下 Docker 的事项。

yum install docker
pip install doker-compose

更多参考 https://www.chenyudong.com/archives/docker-practice.html

gogs的搭建是参考https://zhuanlan.zhihu.com/p/24896056

说一下文中的

    links:
        - mysql:mysql

在配置 gogs 的时候,输入数据库地址,需要输入 mysql:3306,被这个给绕晕了。

同步 git 仓库

因为不是提供一个稳定的仓库给大家推送,因为网络的原因,我的CI服务器无法直接访问git仓库,因此单独搞一个git服务,那么需要将代码同步过来。

看到 这篇文章,觉得思路不错。

# 首先先下载过来
git clone --mirror git@github.com:git_user/project.git

# 先拉取一下代码
cd project.git
git fetch -q --all -p

# 推送代码到另外一个服务上
git remote add another_git http://git.com/git_user/project.git


# 周期任务
sudo vi /etc/cron.d/sync_git_repos
*/5 * * * * app cd /path/to/project.git && git fetch -q --all -p && git push another_git --all

接下来配合文档服务和CI服务,进行持续集成。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 利用 Docker 镜像 gogs 搭建一个私有的 git 服务 – https://www.chenyudong.com/archives/gogs-git-docker-service.html

分类: DevOps

Docker 实践记录

记录一下使用的 Docker 的辛苦过程。

Docker 使用的范围越来越广,我最看重的就是环境隔离,和环境整体打包服务,不用再自己的本地环境上编译。

本文以 CentOS 7 来作为记录过程,其他的发行版类似,就一些系统级别的命令可能不合适。

安装

yum insatll docker

重启

systemctl daemon-reload
systemctl restart docker

本地镜像加速

出现

root@VM_96_130_centos tmp]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ... 
Pulling repository docker.io/library/mysql
Error while pulling image: Get https://index.docker.io/v1/repositories/library/mysql/images: dial tcp 52.207.59.176:443: getsockopt: network is unreachable
Error while pulling image: Get https://index.docker.io/v1/repositories/library/mysql/images: dial tcp 52.207.59.176:443: getsockopt: network is unreachable

我这里使用的是腾讯云,因此我这里的是镜像加速和下载

vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker-current daemon \
          --exec-opt native.cgroupdriver=systemd \
          --registry-mirror=https://mirror.ccs.tencentyun.com \
          -g /data/docker/ \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY

顺便更改一下 docker 镜像的路径,防止系统根目录太小。

网上也有说 /etc/default/docker为啥不起作用的

HTTP 代理

利用 docker build -t xxx . 出现一些错误

Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80]

修改 Dockerfile ,增加http代理

FROM ubuntu:14.04
MAINTAINER Kevin Littlejohn <kevin@littlejohn.id.au>, \
    Alex Fraser <alex@vpac-innovations.com.au>

# 这个是可用的
ENV http_proxy=http://xx.xx.xx.xx:6788/
ENV https_proxy=http://xx.xx.xx.xx:6788/


# 网上有这么说的,这个是不能用于 ubuntu的agt-get。
ENV HTTP_PROXY=http://xx.xx.xx.xx:6788/
ENV HTTPS_PROXY=http://xx.xx.xx.xx:6788/

目前没有找到一个说法,http_proxy 是否应该大写。应该是不同的程序读取的环境变量不一样,我看大部分都是小写,最好的方法是都设置。

有一些讨论:http://unix.stackexchange.com/questions/212894/whats-the-right-format-for-the-http-proxy-environment-variable-caps-or-no-ca

常用的命令记录

docker build

# 编写 Dockerfile 文件
docker build -t docker-proxy .

docker images

查看镜像

docker exec

# 进入容器内部
docker exec -it 容器id /bin/bash

docker run

# 打开镜像看看
# 因为有时候直接启动会被退出了。
docker run -i -t ubuntu:14.04 /bin/bash

docker-compose

pip install docker-compose
# 编写 docker-compose.yml 文件
docker-compose up -d 

其他的系统也有依赖 docker 的,出现了

  File "/root/readthedocs/readthedocs.org/readthedocs/doc_builder/environments.py", line 16, in <module>
    from docker import Client
ImportError: cannot import name Client

那么其他使用 virtualenv 来解决单独的部署问题,让默认的系统能够正常使用。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Docker 实践记录 – https://www.chenyudong.com/archives/docker-practice.html

分类: DevOps

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑