教程地址:
https://www.runoob.com/docker/docker-tutorial.html
(另一个很好的教程):http://www.dockerinfo.net/document
镜像表示:
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 如ubuntu:15.10
容器使用
-
docker命令帮助
docker # 查看全部命令 docker command --help # 查看command使用详情
-
新建容器
docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载 - 利用镜像创建并启动一个容器 - 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 - 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去 - 从地址池配置一个 ip 地址给容器 - 执行用户指定的应用程序 - 执行完毕后容器被终止
-
新建交互式的容器
docker run -i -t --name runtest ubuntu:15.10 /bin/bash
各个参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
- –name 指定容器名
-
通过运行 exit 命令或者使用 CTRL+D 来退出容器
-
启动容器(后台模式)
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" docker run -itd --name ubuntu-test ubuntu /bin/bash # 交互式后台运行
-
查看容器
docker ps # 查看正在运行容器 docker ps -l # 查看最新一个创建的容器 docker ps -a # 查看所有容器
输出详情介绍:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- REATED: 容器的创建时间。
- STATUS: 容器状态。
- 状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
也可以使用 docker inspect 来查看容器的名字
docker inspect -f "{{ .Name }}" aed84ee21bde >>/web
-
查看容器内的标准输出
docker logs 容器名/容器id docker logs -f 容器名/容器id
- -f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
-
容器使用(非新建)
docker start 容器名/容器id # 启用容器 docker stop 容器名/容器id # 停止容器 docker restart 容器名/容器id # 重启容器
docker start ... 包含容器文件系统挂载的操作 docker stop ... 包含容器文件系统卸载的操作 docker restart ... 不包含容器文件系统的卸载与挂载操作,本质上docker restart不涉及文件系统的操作,因此restart命令并不是stop与start两个命令的顺序叠加。 但为了保证容器的根文件系统与内存系统mount的正确性,推荐对一个容器的重启使用docker stop xxx 然后 docker start xxx,而非docker restart xxx。
-
进入容器
# 使用-d启动容器后,容器会在后台运行,要想进入,可使用以下两个方式 docker attach 容器名/容器id # exit后,会停止容器,同时当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。 docker exec -it 容器名/容器id /bin/bash #推荐,exit后,不会停止容器
-
删除容器
docker rm -f 容器名/容器id # 强制删除,即使容器在运行
-
容器更新
# 某个使用相同镜像的容器,新安装了iputils-ping,然后提交到了镜像中 # 另一个使用相同的容器,则可如下更新后安装 apt-get update apt install iputils-ping
-
指定端口
https://www.runoob.com/docker/docker-container-connection.htmldocker run -d -P training/webapp python app.py # 随机端口 docker run -d -p 5000:5000 training/webapp python app.py # 指定端口 docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py # 绑定网络ip,访问127.0.0.1:5001则可访问容器5000端口 docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py # /udp绑定容器udp端口 ,127.0.0.1:5000->5000/udp docker port 容器名/容器id # 查看容器端口映射,如返回 5000/tcp -> 0.0.0.0:5000
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上。 通过docker ps 的Ports查看映射关系,如0.0.0.0:32769->5000/tcp,即把宿主机的32769映射到容器的5000端口,可通过浏览器登录 宿主机ip:32769登录。
-
检查容器
docker top 容器名/容器id # 查看容器内部运行的进程 docker inspect 容器名/容器id # 查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
镜像使用
-
列出镜像列表
docker images
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
-
-
查找镜像
docker search 镜像名
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
-
拉取镜像
docker pull 镜像名 # 默认拉取最新版本, docker pull 镜像名:版本号 # 拉取指定版本
-
删除镜像
docker rmi 镜像名(或镜像名:版本号)
-
设置镜像标签
docker tag 860c279d2fec runoob/centos:dev # docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
容器互联
- docker network create -d bridge test-net 方案: https://www.runoob.com/docker/docker-container-connection.html
- link方案: http://www.dockerinfo.net/%e4%bd%bf%e7%94%a8%e7%bd%91%e7%bb%9c
- docker compose 方案
配置DNS
全量配置
可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:
$ docker run -it --rm ubuntu cat etc/resolv.conf
- –rm:容器退出时自动清理容器内部的文件系统。
指定容器配置
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
-
–rm:容器退出时自动清理容器内部的文件系统。
-
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
-
–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
-
–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。
数据卷和数据卷容器
http://www.dockerinfo.net/%e6%95%b0%e6%8d%ae%e5%8d%b7volumes
https://www.cnblogs.com/wade-luffy/p/6542539.html
生产环境中使用Docker的过程中,往往需要对数据进行持久化(挂载一个主机目录作为数据卷方式),或者需要在多个容器之间进行数据共享(数据卷容器),这必然涉及容器的数据管理操作。
其实,不挂载主机目录,仅用 -v /path的容器,就是数据卷容器
Docker Dockerfile
修改已有镜像
先使用下载的镜像启动容器。
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
注意:记住容器的 ID,稍后还会用到。
在容器中添加 json 和 gem 两个应用。
root@0b2616b0e5a8:/# gem install json
当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。
使用 docker images 来查看新创建的镜像。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
之后,可以使用新的镜像来启动容器
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#
利用 Dockerfile 来创建镜像
总结的好,不用精简:https://www.runoob.com/docker/docker-dockerfile.html
补充:http://www.dockerinfo.net/image%e9%95%9c%e5%83%8f