|
# 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 |
Is it possible to enter a docker container and interact with it through a command-line node application?