Docker入门

2021/06/21

Tags: Docker

摘要:Docker简单使用。


Docker 是一个开源的应用容器引擎,基于 Go 语言开发,并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker下载地址:https://www.docker.com/get-started

安装完成后,才可以执行docker的相关命令。

$ docker system info

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  compose: Docker Compose (Docker Inc., 2.0.0-beta.3)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.7
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.25-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 6
 Total Memory: 1.941GiB
 Name: docker-desktop
 ID: TA2L:IL5R:BGA2:7NS2:RE5C:LOZ6:7RHP:275V:F5OQ:KAJP:QHWN:VOQU
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

mac上停止docker服务:

⇒  launchctl list |grep docker
-    0    com.docker.helper
11963    0    application.com.docker.docker.10740542.10740926

⇒  launchctl stop application.com.docker.docker.10740542.10740926

运行hello world容器

$ docker run busybox echo "hello world"

Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
b71f96345d44: Pull complete
Digest: sha256:930490f97e5b921535c153e0e7110d251134cc4b72bbb8133c6a5065cc68580d
Status: Downloaded newer image for busybox:

docker run busybox echo "hello world" 这行命令启动了一个叫busybox的容器,并且执行了echo "hello world"

然后docker先在本地查询busybox,发现没有找到,然后就从远程拉取镜像,拉取完成后启动镜像。

⇒  docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    69593048aa3a   13 days ago   1.24MB

可以发现本地多了一个busybox的镜像。

镜像

docker image ls 可以列出本地的所有镜像,然后具体看看镜像信息。

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    69593048aa3a   13 days ago   1.24MB

各个选项说明:

当镜像没有显式指定TAG时,Docker会默认指定为latest。例如上述的镜像。

如果想run指定版本的镜像:

docker run <image>:<tag>

镜像常用命令

$  docker images # 镜像列表 等价于 docker image ls
$  docker search httpd # 查找镜像
$  docker pull httpd # 拉取镜像
$  docker push httpd # 向镜像仓库推送镜像
$  docker run httpd # 运行镜像
$  docker rmi httpd # 删除镜像
$  docker tag 860c279d2fec runoob/centos:dev
   #执行这条命令不会得到新镜像,只会给之前的镜像加一个TAG:
   #REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
   #busybox      latest    69593048aa3a   13 days ago   1.24MB
   #busybox      v1.0      69593048aa3a   13 days ago   1.24MB
   
$  docker commit -m="has update" -a="Archie" ac68f5f16776 busybox:v2 # 更新镜像,需要借助container
   # -m: 提交的描述信息;
   # -a: 指定镜像作者
   # ac68f5f16776:容器 ID
   # busybox:v2:指定要创建的目标镜像名以及TAG
   
$  docker build -t go_http_server_demo .
   # 构建镜像,前提是当前目录下有Dockerfile,-t go_http_server_demo 指定image的名称,. 基于当前目录构建。

容器

如果把镜像比作calss的话,那容器就是这个class的实例对象。

⇒  docker  run --name busybox -it busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # exit

docker run 命令从指定镜像运行容器,-i: 交互式操作;-t: 终端。要退出终端,直接输入 exit;–name busybox 指定容器的名称。

docker run --name go_http_server_demo -p 8080:8080 -d go_http_server_demo

–name 可以指定container的名称;-p 8080:8080 会将本地的端口8080映射到容器的8080端口; -d 表示这个容器会进入后台运行; 最后指定了镜像的名称。

docker ps -a 查看运行的所有容器。

⇒  docker ps -a
CONTAINER ID   IMAGE     COMMAND                CREATED              STATUS                          PORTS     NAMES
33e3123ff520   busybox   "sh"                   17 seconds ago       Exited (0) 2 seconds ago                  busybox

如果指定–name,下次再执行run时,会出现如下错误:

docker: Error response from daemon: Conflict. The container name "/busybox" is already in use by container "33e3123ff520985d12eed46e31051bf2b393fe45fa0e353d5ffa16ab835e940c". You have to remove (or rename) that container to be able to reuse that name.

因为已经指定过这个name,并且这个容器已经启动过,如果还想启动这个容器,那只需要再启动这个容器即可,无需执行run。

容器常用命令

$  docker  run --name busybox -it busybox # 从镜像中启动一个容器
$  docker ps -a # 列出所有容器。包括已经停止的
$  docker ps # 列出正在运行的容器
$  docker stop <容器 ID> # 停止一个容器
$  docker start <容器 ID> # 启动一个已停止的容器
$  docker restart <容器 ID> # 重启容器
$  docker attach f59fcdac1cc0 # 进入容器,退出时会导致容器的退出
$  docker exec -it 33e3123ff520 sh # 进入容器,退出时不会导致容器的退出,sh 为run容器时指定的COMMAND
$  docker container rm -f 33e3123ff520 # 删除容器