Docker

配置环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装 Docker
sudo apt install docker-ce
sudo apt install docker.io # debian
# 不用 sudo 使用 docker (可选)
sudo groupadd docker
sudo usermod -aG docker $USER # 将当前用户添加至 docker 组
newgrp docker # 使修改生效
# 配置 image 仓库
# echo DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com" >> /etc/default/docker
docker run hello-world # 测试
# 配置 docker 自启
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
# 修改 docker images 存储目录
docker info # Docker Root Dir: /var/lib/docker
sudo vim /etc/docker/daemon.json # 没有就创建
{
"data-root": "/home/docker"
}
sudo systemctl restart docker.service
sudo mv /var/lib/docker /home/docker
1
2
3
4
5
# nvidia 显卡支持
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get install -y nvidia-docker2

基本用法

1
2
3
4
5
6
7
8
9
10
docker ps # 查看正在运行的容器
docker ps a # 查看所有容器
docker start/stop id/name # 启动/停止某个容器
docker start -i id/name # 以交互方式启动一个容器
docker attach id/name # 进入某个容器 (使用 exit 退出后容器也跟着停止运行)
docker exec -it id/name # 启动一个伪终端以交互式的方式进入某个运行的容器(使用 exit 退出后容器不停止运行)
docker exec -it <容器> /bin/bash # 进入容器
docker rm id/name # 删除某个容器
docker network ls # 查询网络
docker network create <name> # 创建网络

创建镜像

docker build -t xxx .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM node:latest
WORKDIR /var/www/hexo
RUN echo "Asia/Shanghai" > /etc/timezone
RUN groupadd -r aaa && useradd -r -g aaa aaa

RUN apt install git
RUN npm install npm hexo-cli -g

# USER aaa
RUN git config --global init.defaultBranch main \
&& git config --global user.name "aaa" \
&& git config --global user.email "aaa@bbb.com"

CMD npm install && hexo clean && hexo generate && hexo server

# EXPOSE 4000
# CMD ["/bin/bash"]

搭建 GitLab

  • 下载镜像

    1
    2
    docker search gitlab
    docker pull gitlab/gitlab-ce
  • 启动容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    docker run \
    --detach \
    --hostname gitlab.example.com \ # 设置主机名或域名
    --publish 1443:443 \ # 本地端口的映射,也可使用 443:443,可能有冲突
    --publish 8080:80 \ # 本地端口的映射,也可使用 80:80,可能有冲突
    --publish 2222:22 \ # 本地端口的映射,也可使用 22:22,可能有冲突
    --name gitlab \ # gitlab-ce 的镜像运行成为一个容器,这里是对容器的命名
    --restart unless-stopped \ # 设置重启方式
    --volume /home/gitlab/etc:/etc/gitlab \ # 将 gitlab 的配置文件目录映射到 /home/gitlab/etc 目录中
    --volume /home/gitlab/log:/var/log/gitlab \ # 将 gitlab 的日志文件目录映射到 /home/gitlab/log 目录中
    --volume /home/gitlab/opt:/var/opt/gitlab \ # 将 gitlab 的数据文件目录映射到 /home/gitlab/opt 目录中
    gitlab/gitlab-ce # 需要运行的镜像
  • 修改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ vim /home/gitlab/etc/gitlab.rb

    # 配置 http 协议所使用的访问地址 --- 就是你主机的地址或者域名,不加端口号默认为 80
    # 如果上述容器 80 端口映射的是非 80 端口,此处需要加上端口号:8080:80,那下面就得拼上 8080
    external_url 'http://192.168.31.110'
    # external_url 'http://192.168.31.110:8080'

    # 配置 ssh 协议所使用的访问地址和端口,此处不用加端口
    gitlab_rails['gitlab_ssh_host'] = '192.168.31.110'

    # 此端口是 run 时 22 端口映射的 22 端口,同理,如果映射的是非 22 端口,此处也得写映射后的端口
    gitlab_rails['gitlab_shell_ssh_port'] = 22
    # gitlab_rails['gitlab_shell_ssh_port'] = 2222

    $ docker exec gitlab gitlab-ctl reconfigure # 使配置文件生效
    $ docker restart gitlab # 重启 gitlab
  • 获取 gitlab 的 root 密码

    1
    2
    3
    docker exec -it gitlab /bin/bash # 进入容器
    # 容器内部执行
    cat /etc/gitlab/initial_root_password # initial_root_password 文件夹只有在首次启动 gitlab 才会出现,且 24 小时候会自动删除
  • 修改 gitlab 的 root 密码

    1
    2
    3
    4
    5
    6
    7
    8
    docker exec -it gitlab /bin/bash # 进入容器
    # 容器内部执行
    gitlab-rails console -e production
    user=User.where(id:1).first
    user.password="12345678"
    user.password_confirmation="12345678"
    user.save!
    quit

    gitlab 修改 root 密码

搭建 WordPress

  • 下载镜像

    1
    2
    docker pull mysql
    docker pull wordpress
  • 启动容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    docker run \
    --detach \
    --name wpdb \
    --publish 3306:3306 \
    --restart unless-stopped \
    --volume /home/wordpressdb/lib:/var/lib/mysql \ # 挂载数据到宿主机
    --env MYSQL_ROOT_PASSWORD=123456 \ # 设置 MySQL 的 root 账户密码
    --env MYSQL_DATABASE=wordpress \ # 创建数据库 wordpress
    --env MYSQL_USER=wordpress \ # 创建用户 wordpress
    --env MYSQL_PASSWORD=wordpress \ # 设置用户 wordpress 的密码
    mysql

    docker run \
    --detach \
    --name wp \
    --publish 8080:80 \
    --restart unless-stopped \
    --link wpdb:mysql \ # 容器名 : 别名
    --volume /home/wordpress:/var/www/html \
    --env WORDPRESS_DB_HOST=wpdb:3306 \
    --env WORDPRESS_DB_USER=wordpress \
    --env WORDPRESS_DB_PASSWORD=wordpress \
    --env WORDPRESS_DB_NAME=wordpress \
    wordpress
  • 验证容器间通信

    1
    2
    3
    4
    5
    6
    docker exec -it wp bash # 进入 wordpress 容器
    # 容器内部执行
    apt update && apt install iputils-ping # 安装 ping
    ping mysql
    # or
    ping wp-mysql
  • 创建数据库

    1
    2
    3
    4
    5
    docker exec -it wp-mysql bash # 进入容器
    # 容器内部执行
    mysql -u root -p # 登录 MySQL
    create database wordpress; # 创建名为 wordpress 的数据库
    quit

    create database

  • 配置数据库
    config_database

  • 问题:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) —- 等会就好了

搭建 GitBook

搭建 Jeklly

https://www.jekyll.com.cn/

docker-compose

1
2
3
4
docker-compose -f docker-compose.yml up -d
docker-compose down
docker volume ls
docker volume prune
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
32
version: "3"
services:
wordpressdb:
image: mysql:latest
container_name: wpdb
volumes:
- /home/wordpressdb/lib:/var/lib/mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: wpdbadmin
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
image: wordpress:latest
container_name: wp
depends_on:
- wordpressdb
ports:
- "80:80"
volumes:
- /home/wordpress:/var/www/html
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: wordpressdb:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
wpdb_data: {}
wp_data: {}

方法技巧

  • 设置容器时间和时区的方法。方法一:在dockerfile中增加RUN echo "Asia/Shanghai" > /etc/timezone && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime;方法二:在启动容器的时候,将宿主机的对应目录挂在到容器里--volume /etc/localtime:/etc/localtime --volume /etc/timezone:/etc/timezone

参考资料


Docker
https://laplac2.github.io/tools/docker/
作者
Laplace
发布于
2022年1月1日
许可协议