markdown 用于在Docker容器中运行本地Node项目的个人备忘单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 用于在Docker容器中运行本地Node项目的个人备忘单相关的知识,希望对你有一定的参考价值。

# See list of docker virtual machines on the local box
$ docker-machine ls
NAME      ACTIVE   URL          STATE     URL                         SWARM   DOCKER   ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.9.1 

# Note the host URL 192.168.99.100 - it will be used later!

# Build an image from current folder under given image name
$ docker build -t gleb/demo-app .

# see list of build images
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
gleb/demo-app        latest              506bf31537d4        17 minutes ago      904.5 MB
node                 5.0                 c4f955829812        10 weeks ago        642.2 MB

# Note both the original Node:5 and the built images are there

# Let us run the image under name 'demo'
$ docker run --name demo -p 5000:1337 -d gleb/demo-app
9f9f3ae62038805504c3c23cce4e9229008ba6bd9ea16b560a7a9e1cfa932e57

# A good security practice is to run the Docker image (if possible) in read-only mode
# by adding --read-only flag
# See "Docker security" talk at mark 22:00 https://www.youtube.com/watch?v=oANurUSaOFs

# Run docker image with a folder from HOST machine mounted
$ docker run -v /usr/source:/destination --name demo -d gleb/demo-app
# inside the container /destination folder will be pointing at /usr/source from the HOST

# Note: you can pass environment variable values to the `docker run` command
# docker run -e USER=name
# or, if the USER is already an environment var
# docker run -e USER
# or put all env variables into a file and pass its name
# docker run --env-file=<filename>
# You can check all the options passed into the running container
# docker inspect demo

# It prints the long container ID, but we can use our name "demo"
# We also mapped outside port 5000 to container's exposed port 1337
# Let us see running containers
$ docker ps
CONTAINER ID    IMAGE             COMMAND             CREATED              STATUS              PORTS                    NAMES
9f9f3ae62038    gleb/demo-app     "node server.js"    About a minute ago   Up About a minute   0.0.0.0:5000->1337/tcp   demo

# Let us make a dummy request to the app running inside the container
# We will use the virtual machine's IP and outside port 5000
$ curl 192.168.99.100:5000
Not Found

# Let us see the app's console log to confirm that it has received our request
$ docker logs demo
listening on port 1337 { subdomainOffset: 2, proxy: false, env: 'development' }
started server
  <-- GET /
  --> GET / 404 6ms -
# you can follow the logs along using -f (--follow) option

# Jump into the running container to run any commands
# -i option means bind STDIO from the current shell
docker exec -it demo bash
root@9f9f3ae62038:/usr/src/demo-server# ls
... list of files
root@9f9f3ae62038:/usr/src/demo-server# exit

# If you want to quickly list files in the docker container (default folder)
# you can use `docker exec`
$ docker exec -t demo ls
# ... list of files in /usr/src folder

# We can even copy files from the container back into our system
docker cp demo:/usr/src/demo-server/file.txt file.txt
# look at file.txt locally

# Running Docker container in terminal
# If you want to see the output / enter commands *inside the container* right from the terminal
# just skip -d option (-d is for detached mode)
$ docker run --name demo -it gleb/demo-app

# if the container stops (like the command terminates due to error)
# a nice trick is to run the container with dummy infinite command
# then shell into the container and find the problem
$ docker run --name demo -d gleb/demo-app tail -f /dev/null
$ docker exec -it demo bash

# Nice!
# To stop the running container
$ docker stop demo
# simple docker file
# assumes located in the same folder as the application itself

# start with node 5 base image
FROM node:5.0

# run as non-root user inside the docker container
# see https://vimeo.com/171803492 at 17:20 mark
RUN groupadd -r nodejs && useradd -m -r -g nodejs nodejs
# now run as new user nodejs from group nodejs
USER nodejs

# Create an app directory (in the Docker container)
RUN mkdir -p /usr/src/demo-server
WORKDIR /usr/src/demo-server

# Copy .npm settings and package.json into container
COPY package.json /usr/src/demo-server
COPY .npmrc /usr/src/demo-server
# and install dependencies
RUN npm install

# Copy our source into container
COPY src /usr/src/demo-server/src
COPY server.js /usr/src/demo-server

# If our server uses 1337 by default
# expose it from Docker container
EXPOSE 1337

# Finally start the container command
CMD ["node", "server.js"]
## Tips & tricks

Setup an alias to start Node container and map the current folder for quick isolated Linux environment.
Add to `~/.alias` file

```
# Creates Node container with mapped current folder and runs Bash shell
alias node-box='docker run -v $PWD:/src -w /src -u node -it node /bin/bash'
```

## Additional information

* [Dockerizing a Node.js web app](https://nodejs.org/en/docs/guides/nodejs-docker-webapp/)
* [NodeUp Docker podcast episode](http://nodeup.com/ninetyeight)
* [Node Dockerhub images](https://hub.docker.com/_/node/) - list of Docker images with different Node versions
* [Docker cheat sheet](https://github.com/wsargent/docker-cheat-sheet)
* [fuge](https://github.com/apparatus/fuge) - Node microservices and sites with nice development workflow
  - [Microservices with fuge](https://glebbahmutov.com/blog/microservices-with-fuge/) - my blog post showing local development workflow
* [Run Node in a docker container with file access](https://gist.github.com/bahmutov/448f73b49914d1981643)
* If you have multiple Docker files, you can pick the one to use during build `docker build -f <name> .`
* Good video from NodeSource [Need to Node: Getting Started with Node.js, Docker and Kubernetes](https://vimeo.com/171803492)
* You can run very simple process for managing system signals inside the docker container
  and that can start your actual process. [yelp/dumb-init](https://github.com/yelp/dumb-init)
* [8 Protips to Start Killing It When Dockerizing Node.js](https://nodesource.com/blog/8-protips-to-start-killing-it-when-dockerizing-node-js/) includes how to make separate user, caching, etc.
## Troubleshooting

If you open a new terminal, you need the Docker environment variables again. You can set them up in
the current shell by running (assuming the name `default` for the Docker machine)

```sh
eval "$(docker-machine env default)"
```

If the Docker machine becomes unresponsive with status `UNKNOWN` when running `docker-machine ls` try rebuilding it

```sh
$ docker-machine rm -y default && docker-machine create -d virtualbox default && eval $(docker-machine env)
```

To delete all running containers and images (use `-f` option to force)

```sh
#!/bin/bash
# Delete all containers
docker rm $(docker ps -a -q)
# Delete all unused images
docker rmi $(docker images --filter dangling=true)
# Delete all images
docker rmi $(docker images -q)
```

To stop all running containers

```sh
IDS=$(docker ps -q)
docker stop $IDS
# or as a single command
docker stop $(docker ps -q)
```

If you have a container "demo" and would like to investigate it, start it in the interactive mode with a "bash" as entry

```sh
docker run -it --entrypoint bash demo
```

以上是关于markdown 用于在Docker容器中运行本地Node项目的个人备忘单的主要内容,如果未能解决你的问题,请参考以下文章

sh 用于在Docker容器中运行本地Node项目的个人备忘单

markdown 在docker容器中运行binding.pry

markdown 显示未在Docker中运行的容器

markdown 通过Kubernetes运行Docker容器(正在进行中)

markdown 如何在Racnher中的所有主机上运行Docker容器?

使用 Maven 在 gitlab 中运行(Docker)测试容器