Docker 笔记(实战)

# 镜像加速

编辑 /etc/default/docker 文件

CentOS 系统的配置文件是 /etc/docker/daemon.json Ubuntu 系统的配置文件是 /etc/default/docker

{
  "debug": true,
  "experimental": true,
  "registry-mirrors": [
    "https://9zh8kwqg.mirror.aliyuncs.com",
    "http://hub-mirror.c.163.com"
  ]
}
1
2
3
4
5
6
7
8
sudo systemctl daemon-reload
sudo systemctl restart docker
1
2

# 免 sudo

如果还没有 docker group 就添加一个:

sudo groupadd docker
1

将用户加入该 group 内。然后退出并重新登录就生效啦。

sudo gpasswd -a ${USER} docker
1

重启 docker 服务

sudo service docker restart
1

切换当前会话到新 group 或者重启 X 会话

newgrp - docker
1

注意: 最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。

# 管理面板(portainer)

docker volume create portainer_data
docker run -d -p 8001:8000 -p 9001:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
1
2

装完访问 9001 即可。

# 编写 dockerfle

# Vue SPA 模板

FROM node:lts-slim
MAINTAINER wolfx
RUN mkdir -p /app
WORKDIR /app
COPY dist/ /app
RUN npm config set registry https://registry.npm.taobao.org
RUN npm install -g http-server
EXPOSE 8080
CMD ["http-server", "/app"]
1
2
3
4
5
6
7
8
9

# NuxtJS 模板

FROM node:lts-slim
MAINTAINER wolfx
ENV NODE_ENV=production
ENV HOST 0.0.0.0
RUN mkdir -p /app
COPY ./ /app
WORKDIR /app
EXPOSE 3000
# RUN npm config set registry https://registry.npm.taobao.org
RUN npm config set registry http://127.0.0.1:8889/repository/npm-proxy/
RUN npm install --production
RUN npm run build
CMD ["npm", "start"]
1
2
3
4
5
6
7
8
9
10
11
12
13

项目中创建一个 .dockerignore 文件来忽略一些直接跳过的文件:

node_modules
npm-debug.log
1
2

# 如何构建

# build image
docker build -t nuxt-demo ./
1
2

# 如何导出

docker save -o myimages.gz nuxt-demo
1

# 如何导入

docker load -i myimages.gz
1

# 如何运行

# 从容器中的3000映射到容器外8080
docker run --name nuxt-demo -dt -p 8080:3000 nuxt-demo
1
2

# 容器间通信

# --link <name or id>:alias
# 创建并启动名为node的容器,并把该容器和名为mysql的容器链接起来
docker run -d --name node --link mysql:mysql-host node:8
1
2
3

# 如何让容器支持后台服务(特权模式)

docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init
1

# 如何备份数据卷

docker 没有提供特有的备份功能,需要用户用容器挂载卷,然后用 tar 自行备份。不推荐在容器外备份,因为权限可能会异常,对权限敏感的应用就无法正常运行。

# 备份
tar cvpzf /backup/backup.tar.gz /data
# 恢复
tar xvpzf /backup/backup.tar.gz -C /
1
2
3
4

# docker-mongodb

# 下载镜像
docker pull mongo:4.2.6-bionic
# 运行容器,设置映射
docker run --name mongo-4.2.6 -p 27017:27017 -v /data/mongodb/configdb:/data/configdb -v /data/mongodb/db:/data/db -d mongo:4.2.6-bionic
# 如果容器无写文件权限
关闭SELinux
# 进入 mongo shell
docker exec -it mongo-4.2.6 mongo admin
db.createUser({user:'admin',pwd:'admin1357',roles:[{role:'userAdminAnyDatabase',db:'admin'}]});
db.auth('admin', 'admin1357')
exit
# 查看运行的容器信息
docker ps -n 5
# 查看容器的配置信息
docker inspect ID
# 重启容器
docker restart ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# docker-mariadb

docker run -d --name mariadb --restart=always -p 3306:3306 \
 -e MARIADB_ROOT_PASSWORD=5POELaFXVfy7 mariadb/server:10.4
1
2

# docker-GitLab

# 下载镜像
docker pull gitlab/gitlab-ce:12.1.11-ce.0
docker run -d -v /data/gitlab/etc:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab --name gitlab -p 8887:80 gitlab/gitlab-ce:12.1.11-ce.0
# 如果是从旧服务器迁移,备份/还原需要保持相同版本
# 备份时需要保持gitlab处于正常运行状态,直接执行
gitlab-rake gitlab:backup:create
# 使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1530156812_2018_06_28_10.8.4_gitlab_backup.tar的压缩包
# 在老服务器上将备份文件发送至新服务器的相应目录下
# gitlab恢复
gitlab-ctl stop unicorn        # 停止相关数据连接服务
gitlab-ctl stop sidekiq
chmod 777 /var/opt/gitlab/backups/1530156812_2018_06_28_10.8.4_gitlab_backup.tar
gitlab-rake gitlab:backup:restore BACKUP=1530156812_2018_06_28_10.8.4
gitlab-ctl start               # 启动gitlab
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# docker-jenkins

参考: https://www.jianshu.com/p/cf2920acf51a

docker run -d --name jenkins -u root -p 11111:8080 --privileged -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /bin/docker:/bin/docker jenkins/jenkins:lts
1

映射宿主的 docker 到容器内,这样容器内可以构建 docker。 其中 privileged 使得容器的 root 对宿主具有真正的 root 权限。

jenkins 插件更新加速

cd {你的Jenkins工作目录}/updates  #进入更新配置位置
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
1
2
3

# docker 自定义 xampp

docker run --name xampp-custom -d -v /data/xampp/var:/opt/lampp/var  -v /data/xampp/htdocs:/opt/lampp/htdocs -v /data/xampp/logs:/opt/lampp/logs -p 82:81 xampp-custom
1

# docker-compsose 模板

version: "3"
services:
  internal-xampp:
    image: xampp-custom
    container_name: internal-xampp
    ports:
      - "81:81"
    volumes:
      - /data/xampp/var:/opt/lampp/var
      - /data/xampp/htdocs:/opt/lampp/htdocs
      - /data/xampp/logs:/opt/lampp/logs
    networks:
      - internal-bridge
  internal-nginx:
    image: nginx
    container_name: internal-nginx
    ports:
      - "80:80"
    volumes:
      - /data/nginx/etc/conf.d:/etc/nginx/conf.d
      - /data/nginx/html:/usr/share/nginx/html
      - /data/nginx/etc/nginx.conf:/etc/nginx/nginx.conf
    links:
      - internal-xampp:xampp
    networks:
      - internal-bridge
    depends_on:
      - internal-xampp
networks:
  internal-bridge:
    driver: bridge
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# CentOS 7 附录

# CentOS 7 安装后无法联网

ip addr # 查看网卡名称
# 编辑 /etc/sysconfig/network-scripts/网卡名称,设置 ONBOOT=YES
systemctl restart network
1
2
3

# CentOS 7 关闭 SELinux

  • 查看命令getenforce

  • 临时关闭setenforce 0

  • 永久关闭【enforcing—->disabled 或者 permissive—->disabled】

vim /etc/selinux/config

SELINUX=enforcing改为SELINUX=disabled设置后保存,需要重启才能生效。

# CentOS 7 关闭防火墙

sudo systemctl stop firewalld.service       # 停止firewall
sudo systemctl disable firewalld.service    # 禁止firewall开机启动
1
2

# CentOS 8 安装 docker

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y containerd.io
sudo yum install -y --nobest docker-ce docker-ce-cli
sudo systemctl start docker
sudo systemctl enable docker
1
2
3
4
5
6
7
8

# CentOS 8 安装 docker-compose

sudo yum install -y epel-release
sudo yum-config-manager --enable epel
pip3 install --user docker-compose
1
2
3

# 复制(迁移)文件保留权限

rsync -rvzpgo --progress
1