2

我是 Docker 新手,正在尝试了解有关部署 Dockerized 映像的最佳实践的更多信息。我使用下面的 Dockerfile 和 docker-compose.yml 在我的开发主机上构建了一些图像。

构建映像后,我通过 ssh 连接到我的生产服务器,这是 AWS 的 EC2 服务上的一个 Amazon Linux 风格的 T2.micro 实例。我在那里安装了 docker 和 docker-compose,然后尝试构建我的图像,但内存不足。因此,我将在本地主机上构建的镜像发布到 Docker Cloud,现在我希望将这些镜像从 Docker Cloud 部署到 AWS 实例上。

我怎样才能做到这一点?我将非常感谢其他人可以提供的任何帮助!

Dockerfile:

# Specify base image
FROM andreptb/oracle-java:8-alpine

# Specify author / maintainer
MAINTAINER Douglas Duhaime <douglas.duhaime@gmail.com>

# Add source to a directory and use that directory
# NB: /app is a reserved directory in tomcat container
ENV APP_PATH="/lts-app"
RUN mkdir "$APP_PATH"
ADD . "$APP_PATH"
WORKDIR "$APP_PATH"

##
# Build BlackLab
##

RUN apk add --update --no-cache \
  wget \
  tar \
  git

# Store the path to the maven home
ENV MAVEN_HOME="/usr/lib/maven"

# Add maven and java to the path
ENV PATH="$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH"

# Install Maven
RUN MAVEN_VERSION="3.3.9" && \
  cd "/tmp" && \
  wget "http://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz" -O - | tar xzf - && \
  mv "/tmp/apache-maven-$MAVEN_VERSION" "$MAVEN_HOME" && \
  ln -s "$MAVEN_HOME/bin/mvn" "/usr/bin/mvn" && \
  rm -rf "/tmp/*"

# Get the BlackLab source
RUN git clone "git://github.com/INL/BlackLab.git"

# Build BlackLab with Maven
RUN cd "BlackLab" && \
  mvn clean install

##
# Build Python + Node dependencies
##

# Install system deps with Alpine Linux package manager
RUN apk add --update --no-cache \
  g++ \
  gcc \
  make \
  openssl-dev \
  python3-dev \
  python \
  py-pip \
  nodejs

# Install Python dependencies
RUN pip install -r "requirements.txt" && \
  npm install --no-optional && \
  npm run build

# Store Mongo service name as mongo host
ENV MONGO_HOST=mongo_service
ENV TOMCAT_HOST=tomcat_service
ENV TOMCAT_WEBAPPS=/tomcat_webapps/

# Make ports available
EXPOSE 7082

# Seed the db
CMD npm run seed && \
  gunicorn -b 0.0.0.0:7082 --access-logfile - --reload server.app:app

码头工人-compose.yml:

version: '2'

services:
  tomcat_service:
    image: 'bitnami/tomcat:latest'
    ports:
      - '8080:8080'
    volumes:
      - docker-data-tomcat:/bitnami/tomcat/data/
      - docker-data-blacklab:/lts-app/lts/

  mongo_service:
    image: 'mongo'
    command: mongod
    ports:
      - '27017:27017'

  web:
    # gain access to linked containers
    links:
      - mongo_service
      - tomcat_service
    # explicitly declare service dependencies
    depends_on:
      - mongo_service
      - tomcat_service
    # set environment variables
    environment:
      PYTHONUNBUFFERED: 'true'
    # use the image from the Dockerfile in the cwd
    build: .
    ports:
      - '7082:7082'
    volumes:
      - docker-data-tomcat:/tomcat_webapps
      - docker-data-blacklab:/lts-app/lts/


volumes:
  docker-data-tomcat:
  docker-data-blacklab:
4

2 回答 2

1

为了解决这个问题,我遵循 StackOverflow 用户 @MazelTov's 的建议,在我的本地 OSX 开发机器上构建容器,然后将图像发布到 Docker Cloud,然后将这些图像拉到并从我的生产服务器(AWS EC2)运行图像.

安装依赖项

我将尝试概述我在下面遵循的步骤,以防他们帮助他人。请注意,这些步骤要求您在开发和生产机器上安装 docker 和 docker-compose。我使用 gui 安装程序来安装 Docker for Mac。

构建映像

编写 Dockerfile 和 docker-compose.yml 文件后,您可以使用docker-compose up --build.

将图像上传到 Docker 云

构建镜像后,您可以通过以下步骤将它们上传到 Docker Cloud。首先,在Docker Cloud上创建一个帐户。

然后将您的 Docker Cloud 用户名存储在环境变量中(因此您~/.bash_profile应该包含export DOCKER_ID_USER='yaledhlab'(尽管使用您的用户名)。

下次从您的开发者机器登录到您的帐户:

docker login

登录后,列出您的 docker 镜像:

docker ps

这将显示如下内容:

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                      NAMES
89478c386661        yaledhlab/let-them-speak-web   "/bin/sh -c 'npm run…"   About an hour ago   Up About an hour    0.0.0.0:7082->7082/tcp     letthemspeak_web_1
5e9c75d29051        training/webapp:latest         "python app.py"          4 hours ago         Up 4 hours          0.0.0.0:5000->5000/tcp     heuristic_mirzakhani
890f7f1dc777        bitnami/tomcat:latest          "/app-entrypoint.sh …"   4 hours ago         Up About an hour    0.0.0.0:8080->8080/tcp     letthemspeak_tomcat_service_1
09d74e36584d        mongo                          "docker-entrypoint.s…"   4 hours ago         Up About an hour    0.0.0.0:27017->27017/tcp   letthemspeak_mongo_service_1

对于要发布到 Docker Cloud 的每个图像,运行:

docker tag image_name $DOCKER_ID_USER/my-uploaded-image-name
docker push $DOCKER_ID_USER/my-uploaded-image-name

例如,要上传mywebapp_web到您在 Docker 云上的用户帐户,您可以运行:

docker tag mywebapp_web $DOCKER_ID_USER/web
docker push $DOCKER_ID_USER/web

然后,您可以运行open https://cloud.docker.com/swarm/$DOCKER_ID_USER/repository/list以查看您上传的图像。

部署映像

最后,您可以通过以下步骤在 EC2 上部署您的映像。首先,在 Amazon 风格的 EC2 实例上安装 Docker 和 Docker-Compose:

# install docker
sudo yum install docker -y

# start docker
sudo service docker start

# allow ec2-user to run docker
sudo usermod -a -G docker ec2-user

# get the docker-compose binaries
sudo curl -L https://github.com/docker/compose/releases/download/1.20.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# change the permissions on the source
sudo chmod +x /usr/local/bin/docker-compose

注销,然后重新登录以更新您的用户组。然后启动一个屏幕并运行服务器:screen. 屏幕启动后,您应该能够添加一个新的 docker-compose 配置文件,该文件指定已部署图像的路径。例如,我需要获取Docker Cloud 帐户中的let-them-speak-web容器,因此我将上面的文件更改为下面的文件,我将其命名为:yaledhlabdocker-compose.ymlproduction.yml

version: '2'

services:
  tomcat_service:
    image: 'bitnami/tomcat:latest'
    ports:
      - '8080:8080'
    volumes:
      - docker-data-tomcat:/bitnami/tomcat/data/
      - docker-data-blacklab:/lts-app/lts/

  mongo_service:
    image: 'mongo'
    command: mongod
    ports:
      - '27017:27017'

  web:
    image: 'yaledhlab/let-them-speak-web'
    # gain access to linked containers
    links:
      - mongo_service
      - tomcat_service
    # explicitly declare service dependencies
    depends_on:
      - mongo_service
      - tomcat_service
    # set environment variables
    environment:
      PYTHONUNBUFFERED: 'true'
    ports:
      - '7082:7082'
    volumes:
      - docker-data-tomcat:/tomcat_webapps
      - docker-data-blacklab:/lts-app/lts/

volumes:
  docker-data-tomcat:
  docker-data-blacklab:

然后可以运行生产 compose 文件:docker-compose -f production.yml up. 最后,使用另一个终端 ssh 进入,然后使用 . 分离屏幕screen -D

于 2018-03-29T19:06:40.347 回答
0

对,那是真的。Docker Cloud 使用 Docker Hub 作为其本地注​​册表来存储公共和私有存储库。将图像推送到 Docker Hub 后,它们就可以在 Docker Cloud 中使用。

从 Docker 中心拉取镜像与推送镜像相反。这适用于私有和公共存储库。

要在本地下载图像,我总是将 docker 用户名导出到 shell 会话:

# export DOCKER_ID_USER="username"

事实上,我的.bashrc个人资料上有这个。

DOCKER_ID_USER用您的 Docker Cloud 用户名替换值。

然后使用 docker login 命令登录到 Docker Cloud。

 $ docker login

这会使用您的 Docker ID 登录,该 ID 在 Docker Hub 和 Docker Cloud 之间共享

您现在可以运行 docker pull 命令以在本地下载您的图像。

$ docker pull image:tag

这适用于任何云平台,而不是特定于 AWS。

由于您是 docker 新手,这里是我推荐的最佳 Docker 指南,包括 Docker 与 VM 以及使用 Docker swarm 和 Kubernetes 等高级主题。

于 2018-04-01T13:02:47.980 回答