博观而约取,厚积而薄发。
1. 初始Docker
2. 镜像命令
2.1 列出本地主机上的镜像信息
$ docker images [options]
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
REPOSITORY
:镜像的仓库源TAG
:镜像的版本标签IMAGE ID
:镜像IDCREATED
:镜像创建时间SIZE
:镜像大小
可选参数(可以组合使用):
-a
:列出本地所有的镜像(含中间映像层)-q
:只显示镜像ID--digests
: 显示镜像的摘要信息--no-trunc
:显示完整的镜像信息
帮助命令:
$ sudo docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs
2.2 查询镜像
查询源来自 http://hub.docker.com
$ sudo docker search mysql # 镜像名
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used,.... 9682 [OK]
mariadb MariaDB is a community..... 3523 [OK]
............
更多搜索:
- 搜索
stars
超过20的,通过列名过滤
$ sudo docker search mysql --filter=stars=20
- 最多搜索10条(默认25条)
$ sudo docker search mysql --limit 10
2.3 下载镜像
$ docker pull image[:TAG] # 默认:docker pull 镜像名:latest,版本可选
- 例如:拉取
mysql;
$ sudo docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
8559a31e96f4: Pull complete
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
c75914a65ca2: Pull complete
1ae8042bdd09: Pull complete
453ac13c00a3: Pull complete
9e680cd72f08: Pull complete
a6b5dc864b6c: Pull complete
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
2.4 删除镜像
$ docker rmi 镜像ID[:TAG]
- 强制删除
-f
$ sudo docker rmi -f bf756fb1ae65
Untagged: hello-world:latest
Untagged:helloworld@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
- 删除多个
$ docker rmi -f 镜像名1 镜像名2
- 删除全部
$ docker rmi -f $(docker images -qa)
3. 容器命令
3.1 新建并启动容器
- options:
--name="容器新名字"
: 为容器指定一个名称;-d
: 后台运行容器,并返回容器ID,也即启动守护式容器;-i
:以交互模式运行容器,通常与 -t 同时使用;-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用;-P
: 随机端口映射;-p
: 指定端口映射,有以下四种格式ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
$ socker run -it 镜像ID
3.2 列出当前所有正在运行的容器
- options:
-a
:列出当前所有正在运行的容器+历史上运行过的-l
:显示最近创建的容器。-n 10
:显示最近创建的10个容器。-q
:静默模式,只显示容器编号。--no-trunc
:不截断输出。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1219aae1f4a8 ubuntu "/bin/bash" 42 seconds ago Up 38 seconds cool_kilby
3.3 退出容器
$ exit :容器停止运行退出
$ ctrl+P+Q :容器不停止退出
3.4 重启容器
$ docker restart 容器ID
3.5 停止容器
$ docker stop 容器ID
3.6 强制停止
$ docker kill 容器ID
3.7 删除已停止的容器
docker rm 容器ID
docker rm $(docker ps -a -q) #删除多个容器
docker ps -a -q | xrags docker rm #删除多个容器
4.重要容器命令
4.1 启动守护式进程,通过ps
查看不存在
$ docker run -d 镜像ID
# >>>>>>>>>>>>>>>>>>>>>>>>>>
$ sudo docker run -d ubuntu
12a960dcce1bf7af5f162faad7159ec094fc924db26149f86fd7ba0b528d3baf
4.2 查看容器日志
- options
-t
:加入时间戳-f
: 跟随最新的日志打印-tail 30
:显示最后30条
$ docker logs -f -t --tail 3 容器ID
4.3 查看容器内运行的进程
$ docker top 容器ID
4.4 查看容器内部细节
$ docker inspect 容器ID
4.5 进入正在运行的容器并以命令行交互
$ docker exec -it 容器ID bashShell
$ docker attach 容器ID
attach
:直接进入容器启动命令的终端,不会启动新的进程exec
:可以直接在宿主机执行容器类的程序,例如以下:在宿主机查看ubuntu
容器根目录的文件
$ sudo docker exec -t 71b ls -l /
total 48
lrwxrwxrwx 1 root root 7 Jun 6 01:18 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 11:09 boot
drwxr-xr-x 5 root root 360 Jun 27 10:28 dev
drwxr-xr-x 1 root root 4096 Jun 27 10:28 etc
drwxr-xr-x 2 root root 4096 Apr 15 11:09 home
......
4.6 从容器内拷贝文件到主机上
$ docker cp 容器ID:容器内路径 目的主机路径
5. 镜像Commit
类似于git的commit,假如我们的某个镜像启动后,在产生的容器中进行了一些配置的修改,而我们想要保存本次配置过得容器就可以利用它为模板commit一个配置过后的镜像,以后启动当前镜像就已经是配置过后的容器
$ docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
eg:commit一个安装过vim的ubuntu镜像,名称为:atguigu/ubuntu,标签TAG为:1.2
sudo docker commit -m="install vim" -a="ydongy" 52ca02c8b0c9 atguigu/ubuntu:1.2
6. Docker容器卷
容器的持久化,即使容器停止运行,宿主机修改的数据,在容器重新启动运行后仍然能够得到数据
宿主机与容器之间数据共享
6.1 数据卷
- 命令添加
$ docker run -it -v /宿主机绝对路经目录:/容器内目录 镜像名
eg:宿主机的/data/docker-ubuntu目录与容器ubuntu的/MyData目录建立数据共享
$ sudo docker run -it -v /data/docker-ubuntu:/MyData ubuntu
eg:只读权限,只需要加一个ro,代表read-only
$ sudo docker run -it -v /data/docker-ubuntu:/MyData:ro ubuntu
# 如果存在写权限有问题,可加后缀:--privileged=true
- DockerFile添加
# volume test
FROM ubuntu
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] # 在容器中建立两个数据卷,宿主机可以查看内部细节
CMD echo "finished,--------success1"
CMD /bin/bash
通过build
构建一个新的镜像ydongy/ubuntu
,注意结尾的点
$ sudo docker build -f /data/docker-ubuntu/Dockerfile -t ydongy/ubuntu .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM ubuntu
---> 74435f89ab78
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
---> Running in 2be2fbf7b5fd
Removing intermediate container 2be2fbf7b5fd
---> a9434af08c1a
Step 3/4 : CMD echo "finished,--------success1"
---> Running in 6ce8192d90f7
Removing intermediate container 6ce8192d90f7
---> 6272fe09d969
Step 4/4 : CMD /bin/bash
---> Running in 7b26a6661dce
Removing intermediate container 7b26a6661dce
---> be0d288d5a6f
Successfully built be0d288d5a6f
Successfully tagged ydongy/ubuntu:latest
6.2 数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
一句话:继承关系,一个容器继承另一个容器,挂载数据卷可以实现共享
- 启动一个容器
$ docker run -it --name father ubuntu
- 启动一个子容器
$ docker run -it --name son --volumes-from father ubuntu
两个容器对数据卷进行修改时,可以实现共享数据。如果存在多个子容器继承一个父容器,所以的容器都可以共享数据,哪怕把父容器给删除了,剩余的子容器之间仍然能够共享。