摘要: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
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小 同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
当镜像没有显式指定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 # 删除容器