# 阿里云Centos7 Docker的一些玩法

Docker要求64位的系统且内核版本至少为3.10

# 安装Docker

# 添加yum源 如果电脑已经安装就就忽略

yum install epel-release –y
yum clean all
yum list 

# 安装并运行Docker

yum install docker-io –y
systemctl start docker

# 检查安装结果

docker info

图片

# 安装Docker Compose

安装地址 (opens new window)

# 下载安装包
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 安装
sudo chmod +x /usr/local/bin/docker-compose
# 建立软连接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 检查是否安装成功
sudo docker-compose --version

# Docker 常用指令

Docker 命令大全 (opens new window)

Docker run 运行生成容器命令
docker run -d -p 80:80 -v /data:/data --name mynginx  nginx:latest

-d: 后台运行容器,并返回容器ID;

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-v ,--volume : 绑定一个卷 (讲宿主机器的文件个容器内的文件做映射相互作用)

--name="nginx-lb": 为容器指定一个名称; 结束删除或者 exec 进入容器都可以使用该名字

--link=[]: 添加链接到另一个容器;

-m :设置容器使用内存最大值;

--env-file=[]: 从指定文件读入环境变量;

-h "mars": 指定容器的hostname;

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-e username="ritchie": 设置环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--expose=[]: 开放一个端口或一组端口;

Docker exec 进入容器命令
# 通常只是用 -it
docker exec -it  mynginx /bin/bash

-d :分离模式: 在后台运行

-i :即使没有附加也保持STDIN 打开

-t :分配一个伪终端

Docker kill 命令

docker kill :杀掉一个运行中的容器。

docker kill -s KILL mynginx

-s :向容器发送一个信号

Docker start/stop/restart 命令
# 启动已被停止的容器mynginx
docker start mynginx   

#停止运行中的容器mynginx
docker stop mynginx

#重启容器mynginx
docker restart mynginx
Docker rm 命令
# 强制删除容器 db01、db02
docker rm -f db01 db02

# 移除容器 nginx01 对容器 db01 的连接,连接名 db:
docker rm -l db 

#删除容器 nginx01, 并删除容器挂载的数据卷:
docker rm -v nginx01

#删除所有已经停止的容器:
docker rm $(docker ps -a -q)

-f :通过 SIGKILL 信号强制删除一个运行中的容器。

-l :移除容器间的网络连接,而非容器本身。

-v :删除与容器关联的卷

Docker ps 命令
docker ps [OPTIONS]

-a :显示所有的容器,包括未运行的。

-f :根据条件过滤显示的内容。

--format :指定返回值的模板文件。

-l :显示最近创建的容器。

-n :列出最近创建的n个容器。

--no-trunc :不截断输出。

-q :静默模式,只显示容器编号。

-s :显示总的文件大小。

# Docker Dockerfile

Dockerfile 是一个用来构建镜像的文本文件 参考 (opens new window)

FROM node:12-alpine     # 使用的基础镜像文件
WORKDIR /code           # 工作目录的路径
COPY ./package.json ./server.js /code/  # 拷贝文件到/code
COPY ./static /code/static              # 拷贝文件到/code/static
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
	&& apk update && apk add yarn \
	&& yarn config set registry https://registry.npm.taobao.org/ \
	&& yarn             # 这一窜命令,设置镜像源到国内(加速),更新,安装yarn,yarn设置国内镜像源,yarn安装node依赖
CMD ["npm", "start"]    # 容器启动时运行

# 开始构建镜像

# nginx:v3(镜像名称:镜像标签)  . 是指  Dockerfile  所在的目录
docker build -t nginx:v3 .

# Dockerfile里的一些指令参数

FROM:
# 定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:
# 用于执行后面跟着的命令行命令。有以下俩种格式:
# shell 格式: RUN <命令行命令>  等同于,在终端操作的 shell 命令。
# exec 格式: RUN ["可执行文件", "参数1", "参数2"] RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

COPY:
#复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

ADD:
#DD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

CMD:
#类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
#CMD 在docker run 时运行。 (比如运行node项目)
#RUN 是在 docker build (比如node项目安装的依赖文件)

ENV:
#设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
#ENV <key> <value>
#ENV <key1>=<value1> <key2>=<value2>...

VOLUME:
#会吧宿主机的文件夹和容器内的文件做映射保持同步,避免容器损毁数据丢失

EXPOSE:
#仅仅只是声明端口。

WORKDIR:
#指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
#docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
# [参考]()WORKDIR <工作目录路径>

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget <br> && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" <br> && tar -xvf redis.tar.gz

# Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 参考 (opens new window)

# Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

version: "3"

volumes:
        static:         # 数据卷名称
        db:             # 数据卷名称

services:
        web:
                build:                                          # 构建镜像
                        context: ./                             # 上下文环境
                        dockerfile: ./compose/node/Dockerfile   # Dockerfile路径
                ports:
                        - "3000:3000"
                volumes:
                        - static:/code/static       # 使用前面声明的static挂在容器/code/static
                restart: always                     # 总是重启
        nginx:
                build:
                        context: ./
                        dockerfile: ./compose/nginx/Dockerfile
                ports:
                        - "80:80"
                volumes:
                        - static:/code/static
                restart: always
        mysql:
                image: mysql:5.6        # 直接使用镜像构建
                env_file: .env          # 环境变量env,我们写入到了配置文件里,避免密码泄漏
                volumes:    
                        - db:/var/lib/mysql
                ports:
                        - "3306:3306"
                restart: always

# 开始运行项目

-d 加最后面后台运行可退出命令行界面

docker-compose -f docker-compose-prod.yml build
docker-compose -f   docker-compose-prod.yml up -d
Docker compose常用命令
#查看帮助
docker-compose -h

# -f  指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d 

#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d

#停用移除所有容器以及网络相关
docker-compose down

#查看服务容器的输出
docker-compose logs

#列出项目中目前的所有容器
docker-compose ps

#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build

#拉取服务依赖的镜像
docker-compose pull

#重启项目中的服务
docker-compose restart

#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm 

#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com

#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2

#启动已经存在的服务容器。
docker-compose start

#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop

# 安装gitlab汉化版

# 查找镜像

docker search gitlab

图片

# 安装镜像

docker pull docker.io/twang2218/gitlab-ce-zh

图片

# 查看镜像

docker images

图片

# 创建容器

通常会将 GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外, 便于日后升级, 因此请先准备这三个目录。

mkdir -p /mnt/gitlab/etc
mkdir -p /mnt/gitlab/log
mkdir -p /mnt/gitlab/data

准备好这三个目录之后, 就可以开始运行 Docker 镜像了。 我的建议是使用 unless-stopped 作为重启策略,因为这样可以手工停止容器, 方便维护。

docker run \
    --hostname git.xiaohuruwei.com \ #此处改为自己的域名
    --detach \
    --publish 8443:443 \
    --publish 8090:80 \
    --publish 2222:22\
    --name gitlab \
    --restart unless-stopped \   # 也可以设置 always 
    -v /mnt/gitlab/etc:/etc/gitlab \
    -v /mnt/gitlab/log:/var/log/gitlab \
    -v /mnt/gitlab/data:/var/opt/gitlab \
    docker.io/twang2218/gitlab-ce-zh

TIP

-d 后台运行
-p 端口映射 前边是外部端口后面是docker端口
-v  文件映射  前边是宿主机内的文件地址 后边是docker 内部的地址

# 或者通过Docker Compose 来创建

    version: '3'
    services:
        web:
          image: 'twang2218/gitlab-ce-zh:10.5'
          restart: always
          hostname: 'git.xmanv.com'
          environment:
            TZ: 'Asia/Shanghai'
            GITLAB_OMNIBUS_CONFIG: |
              external_url 'http://git.xmanv.com'
              gitlab_rails['gitlab_shell_ssh_port'] = 2222
              unicorn['port'] = 8888
              nginx['listen_port'] = 80
          ports:
            - '80:80'
            - '8443:443'
            - '2222:22'
          volumes:
            - /usr/local/docker/gitlab/config:/etc/gitlab
            - /usr/local/docker/gitlab/data:/var/opt/gitlab
            - /usr/local/docker/gitlab/logs:/var/log/gitlab

# 执行以下进行构建

docker-compose -f   docker-compose-prod.yml up -d

# 配置GitLab主机名

  • 修改/mnt/gitlab/etc/gitlab.rb 把external_url改成部署机器的域名或者IP地址
vim /mnt/gitlab/etc/gitlab.rb

图片

  • 修改/mnt/gitlab/data/gitlab-rails/etc/gitlab.yml
vim /mnt/gitlab/data/gitlab-rails/etc/gitlab.yml
  • 将host的值改成映射的外部主机ip地址和端口,这里会显示在gitlab克隆地址

这一步修改的发端口号8090 会在执行 gitlab-ctl reconfigure 时端口号恢复成80,所以在执行 gitlab-ctl reconfigure 后要重新修改 然后执行重启 gitlab-ctl restart

图片

DANGER

  • 当执行 gitlab-ctl reconfigure 然后重启gitlab时 gitlab-ctl restart 此段代码时会重新应用配置文件 但是会初始化 vim /mnt/gitlab/data/gitlab-rails/etc/gitlab.yml 修改的port端口号为80 导致下边的仓库地址是不包含端口号的
  • 所以应该 先执行 gitlab-ctl reconfigure 然后在修改此文件 vim /mnt/gitlab/data/gitlab-rails/etc/gitlab.yml
  • 然后执行 gitlab-ctl restart

图片

# 像上面步骤修改了GitLab的ip地址一样,临时修改了GitLab的配置之后,得执行如下的命令,应用重新配好的配置并重启GitLab,然后查看GitLab的状态。

  • 因为是容器,所以要进入到gitlab容器中执行命令
docker exec -ti gitlab /bin/bash
  • 然后
gitlab-ctl reconfigure  #花时间比较多
gitlab-ctl restart    #改IP重启就可以了
gitlab-ctl status

常用的几个Gitlab命令

  • 重新应用gitlab的配置
gitlab-ctl reconfigure
  • 重启gitlab服务
gitlab-ctl restart
  • 查看gitlab运行状态
gitlab-ctl status
  • 停止gitlab服务
gitlab-ctl stop
  • 查看gitlab运行日志
gitlab-ctl tail
  • 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sideki

# 打包docker镜像发布流程

  1. 先登录私有账号
docker login --username=xxx@xxx registry.cn-qingdao.aliyuncs.com #这里用的是阿里云镜像

然后输入密码

your password
  1. 进入到项目的DockerFile文件目录

比如我的本地目录这样操作

cd /Users/zeal/Documents/work/code/zealsay_front
  1. 执行build命令打包
docker build -t 你的项目名:TAG .

注意:项目名称的命名空间为 registry.cn-qingdao.aliyuncs.com.

比如配置服务:

docker build -t registry.cn-qingdao.aliyuncs.com/xxx/zealsay_front:beta-1.0.0 .
  1. 推送到阿里云docker私有镜像服务
docker push 你的项目名:TAG

比如:

docker push registry.cn-qingdao.aliyuncs.com/xxx/zealsay_front:beta-1.0.0

相关dockerfile可以参照项目根目录的dockerfile文件,比如前端项目:

FROM node:10-alpine
ENV NODE_ENV=production
ENV HOST 0.0.0.0
COPY . /app
WORKDIR /app
EXPOSE 4000
#此为cnpm淘宝镜像
#RUN npm config set registry https://registry.npm.taobao.org
RUN npm install
RUN npm run build
CMD ["npm", "start"]
最后更新时间: 2/28/2023, 8:33:37 PM