一. 在服务器上安装docker 环境,文档地址:https://docs.docker.com/engine/install/centos/
1.移除老的Docker环境,如果有的话。
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2.设置源
1.sudo yum install -y yum-utils 2. sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 下面这个是淘宝的 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
在设置源的过程中发现一错误提示,粘上
Solved:Could not resolve host: mirrors.iuscommunity.org Search this topic… 1 post • Page 1 of 1 henk Posts: 488 Joined: 14 Dec 2015 22:16 Location: Netherlands Contact: Contact henk Solved:Could not resolve host: mirrors.iuscommunity.org Post by henk » 29 Jan 2020 13:02 Yum update had an issue with the IUS mirror list. ( eFa4 kickstart on Centos7 minimal version installed some time ago) Could not retrieve mirrorlist https://mirrors.iuscommunity.org/mirror ... tocol=http error was 14: curl#6 - "Could not resolve host: mirrors.iuscommunity.org; Unknown error" See "https://github.com/iusrepo/infrastructure/issues/14 Steps: 1. Delete ius-release CODE: SELECT ALL yum erase ius-release rm /etc/yum.repos.d/ius*.repo* 2. and reinstalled it https://ius.io/setup CODE: SELECT ALL yum install \ https://repo.ius.io/ius-release-el7.rpm \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker
sudo systemctl enable docker sudo systemctl start docker
查看版本
docker -v
部署NODEJS
1.eggjs 的package.json 得改改,将start 的 –daemon去掉,因为在docker里需要前台运行
在项目上的根目录 新建 Dockerfile,输入下面的内容
# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像 FROM node:12-alpine # 设置时区 RUN apk --update add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata # 创建app目录 RUN mkdir -p /usr/src/node-app/egg-server # 设置工作目录 WORKDIR /usr/src/node-app/egg-server # 拷贝package.json文件到工作目录 # !!重要:package.json需要单独添加。 # Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。 # 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块。 # 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。 COPY package.json /usr/src/node-app/egg-server/package.json # 安装npm依赖(使用淘宝的镜像源) # 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。 RUN npm i --registry=https://registry.npm.taobao.org # 拷贝所有源代码到工作目录 COPY . /usr/src/node-app/egg-server # 暴露容器端口 EXPOSE 7101 # 启动node应用 CMD npm start
# 拉取要创建的新镜像的 base image(基础镜像),类似于面向对象里边的基础类 FROM node:8.11.3-alpine # 设置时区 ENV TIME_ZONE=Asia/Shanghai # 在容器内运行命令 RUN \ mkdir -p /usr/src/app \ && apk add --no-cache tzdata \ && echo "${TIME_ZONE}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime # 创建 docker 工作目录 WORKDIR /usr/src/app # 拷贝,把本机当前目录下的 package.json 拷贝到 Image 的 /usr/src/app/ 文件夹下 COPY package.json /usr/src/app/ # 使用 npm 安装 app 所需要的所有依赖 RUN npm i RUN npm i --registry=https://registry.npm.taobao.org # 拷贝本地的所有文件到路径中去 COPY . /usr/src/app # 暴露端口。如果程序是一个服务器,会监听一个或多个端口,可以用 EXPOSE 来表示这个端口 EXPOSE 7001 # 给容器指定一个执行入口 CMD npm run start
将项目传到应用服务器,进入项目目录,安装docker 镜像 ,-t 后面的标识符可以改成自己 的
sudo docker build -t node/elder-egg-server .
建好镜后,启动一个容器
sudo docker run -d --name egg-server -p 7101:7101 node/egg-server
-d 为后台运行,启动后看一下是否启动成功
docker ps
docker ps
也可以通过curl命令或者到浏览器里输入应用的访问地址,来查看能否访问应用,如果可以则安装成功。
docker logs containerId
查看日志
docker logs --tail 50 --follow --timestamps containerId
1. 通过查看容器列表,找到需要停止的容器ID;
docker ps
2. 停止容器;
sudo docker stop containerId
3. 删除容器;
sudo docker rm containerId
4. 删除镜像;
# 正常情况可以删除
sudo docker rmi imageId
# 提示无法删除情况下,强制删除
sudo docker rmi -f imageId
相关命令
镜像相关:
查看镜像构建工程
sudo docker history node/koa-server
比如上面我们构建node/koa-server
这个镜像后,可以通过这个命令来查看该镜像的构建过程,来发现问题。
查看所有镜像列表
docker images
删除镜像
sudo docker rmi imageId
sudo docker rmi -f imageId
先查看镜像列表,找到要删除的镜像ID,然后使用该命令删除。-f
为强制删除。
容器相关:
查看所有容器列表
docker ps
查看某个容器的信息docker logs containerId
先查看容器列表,找到要查看容器的ID,然后使用该命令查看。
拷贝主机的文件到容器的目录下
docker cp src/. container:/target
src
为要拷贝的目录名,container
为容器的id,target
为目标目录名。
进入某个容器的环境
sudo docker exec -it containerId /bin/sh
先查看容器列表,找到要查看容器的ID,然后使用该命令查看。/bin/sh
可在执行docker ps
后看到。退出容器可以执行exit;
。
- 在 egg 项目的
package.json
文件中,在 start 启动项中,--daemon
是后台启动。如果使用 docker 容器,需要去除--daemon
. - 进入项目根目录,执行镜像打包命令:
docker build -t image_name ./
- 打包完成以后执行容器启动命令:
docker run -itd --net=host --name container_name -p 8000:8000 image_name
-t
这个参数很重要,它代表不会进入到容器内部去执行命令,如果去掉它,会在容器内部执行启动 Dockerfile CMD 中的命令。- 执行完毕后,可以通过 docker ps 命令去查看,会显示正在运行的容器,如果发现容器没有正常启动,可以执行
docker logs -f containerID
命令,查看容器内的执行日志。
相关问题
- 容器无法正常启动:出现这种情况,首先检查你的容器打包命令是否正确,
docker ps -a
命令查看你打包的所有容器. 容器打包命令中的-itd
中的-d
相当于在容器内部执行了 Dockerfile 文件中的 CMD 命令,我们知道在 nodejs 中执行命令后控制台会有日志输出,可以通过 docker logs -f containerID 检查日志输出。 - 容器正常启动,但是容器中的程序无法正常连接本地宿主机中的数据库等本地服务,首先要搞清楚服务端口号,在容器运行命令中加上对应的端口映射,比如
docker run -itd --net=host --name container_name -p 8000:8000 -p 9999:9999 image_name . --net=host
参数非常重要,这告诉容器和宿主机共享网络。这个时候,在容器内部可以通过你映射的端口号去正常访问本地服务。