--- title: Docker Introduction tags: Docker --- ![](https://i.imgur.com/fK6JeDG.png) :::info * The core concepts are ==image== and ==container== * We can **pull**/**push** images from Docker hub * We can store the image into a tar file with **save** command, and load the image by **load** command * We can run the container by **run** command, and save the container setting by **commit** command * We can write down script in Dockerfile, and run Dockerfile to build the image by **build** command ::: ## You don't have to install docker * [Click here to enjoy docker online](https://labs.play-with-docker.com/ "Play with docker") * You can play around here for 4 hours, and renew again after that ![](https://i.imgur.com/iKc9YOx.png) ## Pull * 1. Let's pull an image called **nginx** from Docker Hub * ```docker pull nginx``` * or ```docker pull nginx:latest``` If you don't specify the version in the end, it will pull the latest version by default ![](https://i.imgur.com/MyNDBkq.png) ## Run * Before run the image, we might wanna check all the images we have, we can list our image by running * ```docker images``` ![](https://i.imgur.com/WFx45O7.png) * Run the image **[more info](https://docs.docker.com/engine/reference/run/)** * ```docker run -d -p 80:80 nginx``` * **-d** means execute in the background ==Detached mode: Run container in the background, print new container id== * **-p 80:80** set external and internal port, first one is external, second one is internal * Then the image **name** you wanna run * After successfully run the image, it will show the container ID, and the port number with link above ![](https://i.imgur.com/J18N4CJ.png) * Click the link, you will see the page ![](https://i.imgur.com/GQKw3EP.png) ### Modify a file inside a container * ```docker exec -it b3 bash``` * b3 is the first 2 letters of container's ID * Hit enter, then you are in! ![](https://i.imgur.com/nfgxghB.png) * Now we gonna modify **index.html** * ```cd /usr/share/nginx/html``` ![](https://i.imgur.com/uNViU08.png) * We can browse **index.html** by running ```cat index.html``` * Let's modify it, ```echo hello world > index.html``` * We can click on the link to see if it has changed ![](https://i.imgur.com/c6Kfoto.png) * We can now type ```exit``` to quit the editor ### Stop running a container * ```docker ps``` to see all the on running containers * ```docker ps -aq``` will list **all** the containers' ID * ```docker stop 26``` to stop the conaitner whose ID starts with 26 ![](https://i.imgur.com/RwIQdgR.png) ### Remove a container * ```docker container rm [container ID]```, You can type the first 2 letters just like examples above ### Remove an image * ```docker images```, list all images * ```docker rmi [image's name]``` ![](https://i.imgur.com/XCNKRV9.png) ## Commit * We can copy container's content's and build an image * ```docker commit [container's ID] [name the image we gonna build]``` ![](https://i.imgur.com/YQHvfSX.png) * Run the image we have just built and see if it's the same * ```docker run -d -p 8080:80 test``` ## Build ### 1. Create a Dockerfile document * ```vim Dockerfile``` * press **i** switch to --INSERT-- mode ```javascript=1 FROM test //which image we gonna use // add all stuff under current src ./ // to this src /usr/share/nginx/html ADD ./ /usr/share/nginx/html/ ``` * press **ESC** to quit insert mode, type **:wq** to save and quit * ==:w== save ==:q== quit ### 2. Create an index.html file * ```vim index.html``` * press **i** switch to --INSERT-- mode ![](https://i.imgur.com/hHOpfuA.png) ```javascript=1 // Type whatever you like Welcome to my page!!! ``` * press **ESC** to quit insert mode, type **:wq** to save and quit ### 3. Run build * ```docker build -t [name the image] .``` ![](https://i.imgur.com/rR8BDVf.png) ## Save * List all the images ```docker images``` * ```docker save [image's name] > [name].tar``` ![](https://i.imgur.com/muB5SG7.png) ## Load * We remove some images before using **load** command, to make sure we really **load** the image from ==.tar== file ![](https://i.imgur.com/qJGN8eI.png) * ```docker load < [tar file name].tar``` ![](https://i.imgur.com/o9l2uR3.png) ## Cheat sheet for removing * List all containers (only IDs) ```docker ps -aq``` * Stop all running containers ```docker stop $(docker ps -aq)``` * Remove all containers ```docker rm $(docker ps -aq)``` * Remove all images ```docker rmi $(docker images -q)``` * Remove all untagged images ```docker rmi $(docker images | grep "^<none>" | awk "{print $3}")``` ## Get into the container (in Windows) ``` winpty docker exec -it [container's id, the first 4 lettes are enoughcd ] bash``` ## Check container's ip ```docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container's id or name]``` ## Logs * List logs of a container `docker logs [container id]` | Name, shorthand| Default | Description| | -------- | -------- | -------- | | --details| | Show extra details provided to logs | | --follow , -f | | Follow log output | | --since | | Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) | | --tail | all | Number of lines to show from the end of the logs | | --timestamps , -t| | Show timestamps | |--until| | Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) | ## Got permission denied while trying to connect to the Docker daemon socket => can't run docker commands without sudo * ```sudo chmod 666 /var/run/docker.sock``` --- ## Install PostgreSQL `docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=11111111 postgres` --- ## Source <iframe width="560" height="315" src="https://www.youtube.com/embed/AASsRoUfisk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>