Docker学习

Docker 是一个轻量级、可移植的容器,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

前言

Docker 包括三大组件

  • 镜像(Image
  • 容器(Container
  • 仓库(Repository

分层技术

镜像是由多层存储所构成,下载镜像往往也是一层一层下载。

一、Docker安装换源

Homebrew

$ brew cask install docker

下载安装包

https://download.docker.com/mac/

版本检查

1
2
ashin@MacBook ~ % docker --version
Docker version 19.03.5, build 633a0ea

换源

阿里云镜像加速器:https://help.aliyun.com/document_detail/60750.html

检查是否生效 docker info

二、Docker Container

HelloWord

docker run ubuntu /bin/echo "Hello world"

参数解释

  • run 运行
  • ubuntu 运行Ubuntu,可以加版本号在后面,如ubuntu:19.03.5
  • /bin/echo “Hello world” 启动的容器里执行的命令

Docker查看帮助

  • docker command --help
  • docker stats --help

交互运行容器

docker run -i -t ubuntu /bin/bash

  • -i 允许你对容器内的标准输入 (STDIN) 进行交互

  • -t 在新容器内指定一个伪终端或终端

  • 使用exitcontrol+ d 退出

  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

后台运行容器

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

1
2
3
ashin@MacBook ~ % docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

63ef1ba66fb7d8755497a6344b9f655fe400abe0b33813bcba132b471422918e
  • -d deamon

  • 容器ID63ef1ba66fb7d8755497a6344b9f655fe400abe0b33813bcba132b471422918e

查看运行容器

docker ps -a

1
2
3
4
ashin@MacBook ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63ef1ba66fb7 ubuntu:15.10 "/bin/sh -c 'while t…" 11 seconds ago Up 10 seconds hungry_zhukovsky
4c483f54d1d8 ubuntu "/bin/bash" 31 minutes ago Up 31 minutes ubuntu-test

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

停止运行容器

docker stop + 容器.ID

重启容器

docker restart 容器.ID

进入容器

docker attach

使用docker attach + 容器.ID,退出容器时,容器也会停止。

docker exec

使用docker exec -it + 容器.ID /bin/bash进入,退出容器,容器不会停止。

导出容器

docker export 容器.ID > ubuntu.tar

如:docker export 4c483f54d1d8 > /Users/ashin/Desktop/ubuntu.tar

导入容器

通过URL导入

docker import + URL

本地导入

cat /Users/ashin/Desktop/ubuntu.tar | docker import - test/ubuntu:v1

  • cat xx | docker import - 表示把管道符前面的输出流,在交给 docker import 执行一遍

删除容器

docker rm -f 容器.ID

三、运行Web应用

pull镜像

docker pull training/webapp

运行

docker run -d -P training/webapp python app.py

指定端口:docker run -d -p 5000:5000 training/webapp python app.py

  • -d:让容器在后台运行。
  • -P(大写):是容器内部端口随机映射到主机的高端口。
  • -p(小写):将容器内部使用的网络端口映射到我们使用的主机上。
1
2
3
4
5
ashin@MacBook ~ % docker run -d -P training/webapp python app.py
2e96b7487b5fcaa61052205a309bddd23ac4c803592b237a4631133090608ade
ashin@MacBook ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e96b7487b5f training/webapp "python app.py" 26 seconds ago Up 25 seconds 0.0.0.0:32768->5000/tcp angry_mccarthy

PORTS:Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

查看端口映射

docker port 容器.ID

容器内部的标准输出

docker logs -f 容器.ID

查看Web进程

docker top

检查Web应用

docker inspect 容器.ID

停止Web应用

docker stop 容器.ID

重启Web应用

docker start 容器.ID

移除Web应用

docker rm 容器.ID

  • 移除前,先停止容器

四、Docker Image

查看镜像

docker imagesdocker image ls

查找镜像

docker search

获取镜像

docker pull 镜像.名字:ID

  • 不指定 ID,默认为 latest

镜像大小

docker system df

虚悬镜像

<none> 无仓库、标签

查看docker image ls -f dangling=true

删除docker image prune

中间层镜像

~

删除镜像

docker rmi 镜像.名字|ID

  • rmi Remove one or more images

提交副本

docker commit -m="has update" -a="Ashin" 257155c9fcba ubuntu:v3

  • -m 提交信息
  • -a 作者
  • ubuntu:v3 ubuntu为镜像名,v3为TAG

五、Docker仓库

Docker-Hub

https://hub.docker.com/注册

docker login 登录

docker logout退出

推送镜像

docker push username/镜像:TAG

六、Docker Machine

使用 docker-machine 命令来管理主机。

参考