Skip to content

Instantly share code, notes, and snippets.

@santoshstha
Forked from bradtraversy/docker-help.md
Created January 13, 2024 07:58
Show Gist options
  • Save santoshstha/fea20703084d1b856e5eb4ccaca447bb to your computer and use it in GitHub Desktop.
Save santoshstha/fea20703084d1b856e5eb4ccaca447bb to your computer and use it in GitHub Desktop.

Revisions

  1. @bradtraversy bradtraversy revised this gist Aug 14, 2018. 1 changed file with 5 additions and 11 deletions.
    16 changes: 5 additions & 11 deletions docker-help.md
    Original file line number Diff line number Diff line change
    @@ -378,23 +378,23 @@ COPY index.html index.html
    ### Build image from Dockerfile

    ```
    $ docker image build -t nginx-with-html
    $ docker image build -t nginx-website
    ```

    ### Running it

    ```
    $ docker container run -p 80:80 --rm nginx-with-html
    $ docker container run -p 80:80 --rm nginx-website
    ```

    ### Tag and push to Dockerhub

    ```
    $ docker image tag nginx-with-html:latest btraversy/nginx-with-html:latest
    $ docker image tag nginx-website:latest btraversy/nginx-website:latest
    ```

    ```
    $ docker image push bradtraversy/nginx
    $ docker image push bradtraversy/nginx-website
    ```

    # VOLUMES
    @@ -476,7 +476,7 @@ docker volume inspect mysql-db
    ### Run and be able to edit index.html file (local dir should have the Dockerfile and the index.html)

    ```
    $ docker container run -d --name nginx -p 80:80 -v C:/Users/Brad/dev/udemy-docker-mastery/dockerfile-sample-2:/usr/share/nginx/html nginx
    $ docker container run -p 80:80 -v $(pwd):/usr/share/nginx/html nginx
    ```

    ### Go into the container and check
    @@ -493,12 +493,6 @@ $ ls -al
    $ touch test.txt
    ```

    ### Example bind mount for Jekyll (From Bret Fishers course)

    ```
    $ docker run -p 80:4000 -v C:/Users/Brad/dev/udemy-docker-mastery/bindmount-sample-1:/site bretfisher/jekyll-serve
    ```

    # DOCKER COMPOSE

    - Configure relationships between containers
  2. @bradtraversy bradtraversy revised this gist Aug 13, 2018. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion docker-help.md
    Original file line number Diff line number Diff line change
    @@ -20,7 +20,7 @@ $ docker info

    # WORKING WITH CONTAINERS

    ### Create an run a container in background
    ### Create an run a container in foreground

    ```
    $ docker container run -it -p 80:80 nginx
  3. @bradtraversy bradtraversy revised this gist Aug 13, 2018. 1 changed file with 8 additions and 2 deletions.
    10 changes: 8 additions & 2 deletions docker-help.md
    Original file line number Diff line number Diff line change
    @@ -20,10 +20,16 @@ $ docker info

    # WORKING WITH CONTAINERS

    ### Create an run a container (--detach runs in background) We are using nginx as our example image/repo
    ### Create an run a container in background

    ```
    $ docker container run --detach --publish 80:80 nginx
    $ docker container run -it -p 80:80 nginx
    ```

    ### Create an run a container in background

    ```
    $ docker container run -d -p 80:80 nginx
    ```

    ### Shorthand
  4. @bradtraversy bradtraversy created this gist Aug 13, 2018.
    543 changes: 543 additions & 0 deletions docker-help.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,543 @@
    # Docker Commands, Help & Tips

    ### Show commands & management commands

    ```
    $ docker
    ```

    ### Docker version info

    ```
    $ docker version
    ```

    ### Show info like number of containers, etc

    ```
    $ docker info
    ```

    # WORKING WITH CONTAINERS

    ### Create an run a container (--detach runs in background) We are using nginx as our example image/repo

    ```
    $ docker container run --detach --publish 80:80 nginx
    ```

    ### Shorthand

    ```
    $ docker container run -d -p 80:80 nginx
    ```

    ### Naming Containers

    ```
    $ docker container run -d -p 80:80 --name nginx-server nginx
    ```

    ### TIP: WHAT RUN DID

    - Looked for image called nginx in image cache
    - If not found in cache, it looks to the default image repo on Dockerhub
    - Pulled it down (latest version), stored in the image cache
    - Started it in a new container
    - We specified to take port 80- on the host and forward to port 80 on the container
    - We could do "$ docker container run --publish 8000:80 --detach nginx" to use port 8000
    - We can specify versions like "nginx:1.09"

    ### List running containers

    ```
    $ docker container ls
    ```

    OR

    ```
    $ docker ps
    ```

    ### List all containers (Even if not running)

    ```
    $ docker container ls -a
    ```

    ### Stop container

    ```
    $ docker container stop [ID]
    ```

    ### Stop all running containers

    ```
    $ docker stop $(docker ps -aq)
    ```

    ### Remove container (Can not remove running containers, must stop first)

    ```
    $ docker container rm [ID]
    ```

    ### To remove a running container use force(-f)

    ```
    $ docker container rm -f [ID]
    ```

    ### Remove multiple containers

    ```
    $ docker container rm [ID] [ID] [ID]
    ```

    ### Remove all containers

    ```
    $ docker rm $(docker ps -aq)
    ```

    ### Get logs (Use name or ID)

    ```
    $ docker container logs [NAME]
    ```

    ### List processes running in container

    ```
    $ docker container top [NAME]
    ```

    #### TIP: ABOUT CONTAINERS

    Docker containers are often compared to virtual machines but they are actually just processes running on your host os. In Windows/Mac, Docker runs in a mini-VM so to see the processes youll need to connect directly to that. On Linux however you can run "ps aux" and see the processes directly

    # IMAGE COMMANDS

    ### List the images we have pulled

    ```
    $ docker image ls
    ```

    ### We can also just pull down images

    ```
    $ docker pull [IMAGE]
    ```

    ### Remove image

    ```
    $ docker image rm [IMAGE]
    ```

    ### Remove all images

    ```
    $ docker rmi $(docker images -a -q)
    ```

    #### TIP: ABOUT IMAGES

    - Images are app bianaries and dependencies with meta data about the image data and how to run the image
    - Images are no a complete OS. No kernel, kernel modules (drivers)
    - Host provides the kernel, big difference between VM

    ### Some sample container creation

    NGINX:

    ```
    $ docker container run -d -p 80:80 --name nginx nginx (-p 80:80 is optional as it runs on 80 by default)
    ```

    APACHE:

    ```
    $ docker container run -d -p 8080:80 --name apache httpd
    ```

    MONGODB:

    ```
    $ docker container run -d -p 27017:27017 --name mongo mongo
    ```

    MYSQL:

    ```
    $ docker container run -d -p 3306:3306 --name mysql --env MYSQL_ROOT_PASSWORD=123456 mysql
    ```

    ## CONTAINER INFO

    ### View info on container

    ```
    $ docker container inspect [NAME]
    ```

    ### Specific property (--format)

    ```
    $ docker container inspect --format '{{ .NetworkSettings.IPAddress }}' [NAME]
    ```

    ### Performance stats (cpu, mem, network, disk, etc)

    ```
    $ docker container stats [NAME]
    ```

    ## ACCESSING CONTAINERS

    ### Create new nginx container and bash into

    ```
    $ docker container run -it --name [NAME] nginx bash
    ```

    - i = interactive Keep STDIN open if not attached
    - t = tty - Open prompt

    **For Git Bash, use "winpty"**

    ```
    $ winpty docker container run -it --name [NAME] nginx bash
    ```

    ### Run/Create Ubuntu container

    ```
    $ docker container run -it --name ubuntu ubuntu
    ```

    **(no bash because ubuntu uses bash by default)**

    ### You can also make it so when you exit the container does not stay by using the -rm flag

    ```
    $ docker container run --rm -it --name [NAME] ubuntu
    ```

    ### Access an already created container, start with -ai

    ```
    $ docker container start -ai ubuntu
    ```

    ### Use exec to edit config, etc

    ```
    $ docker container exec -it mysql bash
    ```

    ### Alpine is a very small Linux distro good for docker

    ```
    $ docker container run -it alpine sh
    ```

    (use sh because it does not include bash)
    (alpine uses apk for its package manager - can install bash if you want)

    # NETWORKING

    ### "bridge" or "docker0" is the default network

    ### Get port

    ```
    $ docker container port [NAME]
    ```

    ### List networks

    ```
    $ docker network ls
    ```

    ### Inspect network

    ```
    $ docker network inspect [NETWORK_NAME]
    ("bridge" is default)
    ```

    ### Create network

    ```
    $ docker network create [NETWORK_NAME]
    ```

    ### Create container on network

    ```
    $ docker container run -d --name [NAME] --network [NETWORK_NAME] nginx
    ```

    ### Connect existing container to network

    ```
    $ docker network connect [NETWORK_NAME] [CONTAINER_NAME]
    ```

    ### Disconnect container from network

    ```
    $ docker network disconnect [NETWORK_NAME] [CONTAINER_NAME]
    ```

    ### Detach network from container

    ```
    $ docker network disconnect
    ```

    # IMAGE TAGGING & PUSHING TO DOCKERHUB

    # tags are labels that point ot an image ID

    ```
    $ docker image ls
    ```

    Youll see that each image has a tag

    ### Retag existing image

    ```
    $ docker image tag nginx btraversy/nginx
    ```

    ### Upload to dockerhub

    ```
    $ docker image push bradtraversy/nginx
    ```

    ### If denied, do

    ```
    $ docker login
    ```

    ### Add tag to new image

    ```
    $ docker image tag bradtraversy/nginx bradtraversy/nginx:testing
    ```

    ### DOCKERFILE PARTS

    - FROM - The os used. Common is alpine, debian, ubuntu
    - ENV - Environment variables
    - RUN - Run commands/shell scripts, etc
    - EXPOSE - Ports to expose
    - CMD - Final command run when you launch a new container from image
    - WORKDIR - Sets working directory (also could use 'RUN cd /some/path')
    - COPY # Copies files from host to container

    ### Build image from dockerfile (reponame can be whatever)

    ### From the same directory as Dockerfile

    ```
    $ docker image build -t [REPONAME] .
    ```

    #### TIP: CACHE & ORDER

    - If you re-run the build, it will be quick because everythging is cached.
    - If you change one line and re-run, that line and everything after will not be cached
    - Keep things that change the most toward the bottom of the Dockerfile

    # EXTENDING DOCKERFILE

    ### Custom Dockerfile for html paqge with nginx

    ```
    FROM nginx:latest # Extends nginx so everything included in that image is included here
    WORKDIR /usr/share/nginx/html
    COPY index.html index.html
    ```

    ### Build image from Dockerfile

    ```
    $ docker image build -t nginx-with-html
    ```

    ### Running it

    ```
    $ docker container run -p 80:80 --rm nginx-with-html
    ```

    ### Tag and push to Dockerhub

    ```
    $ docker image tag nginx-with-html:latest btraversy/nginx-with-html:latest
    ```

    ```
    $ docker image push bradtraversy/nginx
    ```

    # VOLUMES

    ### Volume - Makes special location outside of container UFS. Used for databases

    ### Bind Mount -Link container path to host path

    ### Check volumes

    ```
    $ docker volume ls
    ```

    ### Cleanup unused volumes

    ```
    $ docker volume prune
    ```

    ### Pull down mysql image to test

    ```
    $ docker pull mysql
    ```

    ### Inspect and see volume

    ```
    $ docker image inspect mysql
    ```

    ### Run container

    ```
    $ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True mysql
    ```

    ### Inspect and see volume in container

    ```
    $ docker container inspect mysql
    ```

    #### TIP: Mounts

    - You will also see the volume under mounts
    - Container gets its own uniqe location on the host to store that data
    - Source: xxx is where it lives on the host

    ### Check volumes

    ```
    $ docker volume ls
    ```

    **There is no way to tell volumes apart for instance with 2 mysql containers, so we used named volumes**

    ### Named volumes (Add -v command)(the name here is mysql-db which could be anything)

    ```
    $ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
    ```

    ### Inspect new named volume

    ```
    docker volume inspect mysql-db
    ```

    # BIND MOUNTS

    - Can not use in Dockerfile, specified at run time (uses -v as well)
    - ... run -v /Users/brad/stuff:/path/container (mac/linux)
    - ... run -v //c/Users/brad/stuff:/path/container (windows)

    **TIP: Instead of typing out local path, for working directory use $(pwd):/path/container - On windows may not work unless you are in your users folder**

    ### Run and be able to edit index.html file (local dir should have the Dockerfile and the index.html)

    ```
    $ docker container run -d --name nginx -p 80:80 -v C:/Users/Brad/dev/udemy-docker-mastery/dockerfile-sample-2:/usr/share/nginx/html nginx
    ```

    ### Go into the container and check

    ```
    $ docker container exec -it nginx bash
    $ cd /usr/share/nginx/html
    $ ls -al
    ```

    ### You could create a file in the container and it will exiost on the host as well

    ```
    $ touch test.txt
    ```

    ### Example bind mount for Jekyll (From Bret Fishers course)

    ```
    $ docker run -p 80:4000 -v C:/Users/Brad/dev/udemy-docker-mastery/bindmount-sample-1:/site bretfisher/jekyll-serve
    ```

    # DOCKER COMPOSE

    - Configure relationships between containers
    - Save our docker container run settings in easy to read file
    - 2 Parts: YAML File (docker.compose.yml) + CLI tool (docker-compose)

    ### 1. docker.compose.yml - Describes solutions for

    - containers
    - networks
    - volumes

    ### 2. docker-compose CLI - used for local dev/test automation with YAML files

    ### Sample compose file (From Bret Fishers course)

    ```
    version: '2'
    # same as
    # docker run -p 80:4000 -v $(pwd):/site bretfisher/jekyll-serve
    services:
    jekyll:
    image: bretfisher/jekyll-serve
    volumes:
    - .:/site
    ports:
    - '80:4000'
    ```

    ### To run

    ```
    docker-compose up
    ```

    ### You can run in background with

    ```
    docker-compose up -d
    ```

    ### To cleanup

    ```
    docker-compose down
    ```