零基础学习Docker
基础语法
docker pull
: 从DockerHub上拉取镜像
$ docker pull ngnix
Using default tag: latest
latest: Pulling from library/nginx
9e3ea8720c6d: Pull complete
bf36b6466679: Pull complete
15a97cf85bb8: Pull complete
9c2d6be5a61d: Pull complete
6b7e4a5c7c7a: Pull complete
8db4caa19df8: Pull complete
Digest: sha256:721cbabd4f976638504427458ad619fdf32967176835b4779e6bef243b2e8972
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
该指令可以配合标签Tag
来获取想要的版本(默认为latest
)
$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
===============>省略<==============
$ docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
===============>省略<==============
docker image <command>
: 可用于管理系统上的
$ docker image
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
Run 'docker image COMMAND --help' for more information on a command.
常用的有: ls
、history
、pull
、rm
$ docker image ls
列出系统中的docker镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 448a08f1d2f9 6 hours ago 142MB
==================>.....<=======================
$ docker image rm REPOSITOPY:TAG 或 IMAGE ID
例如删除ubuntu:20.04镜像的部分回显
Untagged: ubuntu:20.04
Untagged: ubuntu@sha256:db8bf6f4fb351aa7a26e27ba2686cf35a6a409f65603e59d4c203e58387dc6b3
==================>.....<=======================
$ docker image history REPOSITOPY:TAG 或 IMAGE ID
获取该镜像的历史信息
docker images
和docker image ls
的作用相同,只不过自 Docker 17.06 版本开始,更推荐使用后者。
运行一个容器
大体上,运行容器的命令格式是docker run [option] IMAGE_NAME [COMMAND] [ARGUMENTS...]
常用的选项(option):
-d
:以“分离”模式启动。这意味着容器将在后台运行。
-it
: “i”表示交互运行,“t”告诉 Docker 在容器内运行一个 shell。如果想要与容器进行交互,可以选择这个。
-p
:端口映射。将主机操作系统上的端口绑定到容器中公开的端口。-p 主机端口:容器端口
--rm
:一旦Docker完成运行就删除容器。
--name
:给容器取个名字。
-v
:(一般配合Dockerfile),将主机中的某个目录挂在到文件的某个目录。
来一个简单的操作
-- 从Docker Hub上拉取一个镜像
$ docker pull testcontainers/helloworld
=====>拉取过程<=====
$ docker run -d -p 8080:8080 -p 8081:8081 --name Thisisname testcontainers/helloworld
===>在后台运行
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c2b1146d35a testcontainers/helloworld "/helloworld" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp Thisisname
在浏览器访问127.0.0.1:8080即可访问。
关闭容器 docker stop CONTAINER ID
.
Dockerfiles
Dockerfiles 是一个格式化的文本文件,它本质上是作为容器应该做什么的说明手册,并最终组装 Docker 镜像。
FROM
:设置基础映像(操作系统)。必须以此开头,比如FROM ubuntu
RUN
:该命令将在新层内的容器中执行命令,比如RUN apt-get update
COPY
:将文件从本地系统复制到容器中的工作目录。比如COPY /code /www
CMD
:指定启动容器的命令(或脚本)。比如CMD /bin/sh -c script.sh
EXPOSE
:暴露端口,用于声明容器运行时需要监听的网络端口。配合-p
映射出来。比如EXPOSE 80 81
写一个简单的Dockerfile并build
# Get base Docker
FROM ubuntu:22.04
#Update the APT repo
RUN apt-get update -y
# Install Apache2
RUN apt-get install apache2
# tell the container abot port
EXPOSE 5200
# run the apache2 server
CMD ["apache2ctl", "-D", "FOREGROUND"]
docker build -t webserver .
会通过Dockerfile来构建一个容器镜像。
查看一下:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver latest be1b2fa6a23b About an hour ago 230MB
运行(run)容器
$ docker -p 5200:80 webserver
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1bb77e37beb9 testweb "apache2ctl -D FOREG…" 4 minutes ago Up 4 minutes 5200/tcp, 0.0.0.0:5200->80/tcp, :::5200->80/tcp lucid_turing
这里有一个让我很困惑的点,记录一下:
为什么映射的端口为
5200:80
,默认情况下是这个。因为Dockerfile指定的EXPOSE端口为5200,而apache2的默认端口是80,因此只有5200:80
这种组合,分号前是主机端口,分号后是容器端口如果Dockerfile中的是EXPOSE 5200 5201,运行的时候可以是
docker run -p 5200:80 -p 5201:80 webserver
优化Dockerfile
- 只安装必要的包。
- 删除缓存文件。
- 尽量选择最小的基本操作系统,即
FROM xxx
. 最小化层数。
每条指令(FROM、RUN等)都在其自己的层中运行。图层的增加会导致时间的增长。因此,我们再写Dockerfile文件时,要用尽量少的层数。如下:
多层数
FROM ubuntu:latest RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install apache2 -y RUN apt-get install net-tools -y
运行的结果
--omitted for brevity-- Step 2/5 : RUN apt-get update -y ---> Using cache ---> 446962612d20 Step 3/5 : RUN apt-get upgrade -y ---> Running in 8bed81c695f4 --omitted for brevity--
优化
FROM ubuntu:latest RUN apt-get update -y && apt-get upgrade -y && apt-get install apache2 -y && apt-get install net-tools
运行结果:( 只剩下了两层 )
Sending build context to Docker daemon 4.78MB Step 1/2 : FROM ubuntu ---> 2dc39ba059dc Step 2/2 : RUN apt-get update -y && apt-get upgrade -y && apt-get install apache2 -y && apt-get install net-tools ---> Running in a4d4943bcf04 --omitted for brevity--
简化层数,在大文件Dockerfile中会有显著的速度提升。
Docker Compose
https://docs.docker.com/compose/reference/
【挖个坑】