# 阿里云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
# 下载安装包
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 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镜像发布流程
- 先登录私有账号
docker login --username=xxx@xxx registry.cn-qingdao.aliyuncs.com #这里用的是阿里云镜像
然后输入密码
your password
- 进入到项目的DockerFile文件目录
比如我的本地目录这样操作
cd /Users/zeal/Documents/work/code/zealsay_front
- 执行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 .
- 推送到阿里云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"]