docker

参考: 官方docker docs

docker大概分两部

  1. 构建镜像: 执行build.sh脚本准备->调用Dockerfile build -> push
  2. 构建容器,并启动
build.sh
docker-compose.yml       #  docker-compose.yml控制文件
Dockerfile
build.sh
#!/bin/bash

workspace='/www/confcv/daduryi/dockers/nodecv'

cd ${workspace}

for code in nodecv
do
    cd ${workspace}/codes/${code}
    git pull -r
done

cd ${workspace} &&
cp /www/confcv/daduryi/dockers/cv-docker/sources.list sources.list &&

ts=`date +%Y%m%d%H%M%S`

cd ${workspace} && docker build -t registry.daduryi.cn:5000/nodecv -t registry.daduryi.cn:5000/nodecv:$ts .
cd ${workspace} && docker push registry.daduryi.cn:5000/nodecv
cd ${workspace} && docker push registry.daduryi.cn:5000/nodecv:$ts
Dockerfile
FROM node:8.12.0-jessie

RUN rm /etc/localtime
RUN ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ADD sources.list /etc/apt/sources.list
RUN apt-get update

ADD codes/nodecv /www/nodecv

RUN cd /www/nodecv && npm install --registry=https://registry.npm.taobao.org
RUN cd /www/nodecv/public/react-ant-admin/ && npm install --registry=https://registry.npm.taobao.org

RUN cd /www/nodecv/public/react-ant-admin/ && npm run build

CMD node /www/nodecv/bin/www >> /mnt/nodecv.log 2>&1
docker-compose.yml
nodecv:
  restart: always
  image: "registry.daduryi.cn:5000/nodecv:${CV_VERSION}"
  entrypoint: /bin/bash
  command: -c "cd /www/nodecv && node bin/www >> /mnt/nodecv.log 2>&1"
  hostname: "${DOCKER_HOSTNAME}"
  working_dir: /www/nodecv
  ports:
    - 5001:5001
  volumes:
    - ".:/mnt"
  extra_hosts:
    - "tapi-221:10.30.110.120"

docker-compose命令:

docker-compose down	# 关闭容器
docker-compose pull	# 拉去镜像
docker-compose up -d	# 启动容器 (-d 守护)
DOCKER_HOSTNAME=$(hostname)-nws VERSION=latest docker-compose up -d  # 制定环境参数(变量在docker-compose中)

docker命令

# 启动一个容器,并进入shell交互
sudo docker run -i -t node:8.12.0-jessie /bin/bash  	
 # 根据容器id进入正在运行的容器
sudo docker exec -i -t b49bd5188151 /bin/bash        

# 查看当前docker服务下的镜像
sudo docker images					
# 查看但前宿主机运行的docker容器								
sudo docker ps						
	
# 搜索 建议去https://hub.docker.com/官网搜索并查看tag
sudo docker search node			
								
# 构建容器
docker build -t registry.daduryi.cn:5000/nodecv -t registry.daduryi.cn:5000/nodcv:abc .   
# 推送镜像(可制定tag)
docker push registry.daduryi.cn:5000/nodecv[:tag] 		
# 指定tag拉去一个容器									
sudo docker pull node:8.12.0-jessie					

docker pull/search慢

参考: docker改国内官方镜像

  1. 增加或修改/etc/docker/daemon.json, 并重启docker服务
国内镜像
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}
  1. 命令直接从该镜像加速地址进行拉取
docker pull registry.docker-cn.com/myname/myrepo:mytag
  1. 给Docker守护进程配置加速器
docker --registry-mirror=https://registry.docker-cn.com daemon

解决Docker build时 Sending build context to Docker daemon 过大的问题

https://blog.csdn.net/tyler20008/article/details/48352661
https://blog.csdn.net/xs20691718/article/details/79502406
Docker Client会默认发送Dockerfile同级目录下的所有文件到Dockerdaemon中。
解决办法有两种:

  1. 使用.dockerignore文件,设置黑名单,该文件包含的目录不会被发送到Docker daemon中, codes不能放到.dockerignore
    .dockerignore
node_modules
  1. 将Dockerfile迁移后其他目录中执行。

镜像查找

在Docker Hub 搜索, 并挑选合适tag

docker启动nodejs需要使用pm2吗?

笔者认为不需要, 一个容器一个程序原则, 该程序前台运行, 指定了restart=always, 和-d
参考: segmentfault问答

docker容器能和宿主机的所有网卡均在一个内网

容器内访问宿主机不要使用127.0.0.1, 建议使用宿主机内网ip, 并且确保宿主机的服务都有bind内网ip

docker cache

docker存在cache机制, 执行前会比较内容有没有变化, 没有变化会使用cache, 常见案例是先copy进packages.json执行npm install 再copy代码.

多级构建可充分利用缓存

一份为 Node.js 应用准备的 Dockerfile 指南, 含多级构建
「Allen 谈 Docker 系列」docker build 的 cache 机制

查看容器日志:
https://blog.csdn.net/benben_2015/article/details/80708723
https://blog.csdn.net/weixin_38250126/article/details/81281476

你可能感兴趣的:(docker)