镜像与容器
- 搜索镜像
docker search $mirror-name
- 获取镜像
可以使用以下指令拉取镜像到本地,其中冒号后的 $tag 为镜像的版本标签,如果省略冒号及之后的内容,则为下载最新版本即 :latest。版本标签信息可以在镜像市场中查找到
docker pull $mirror-name:$tag
- 查看镜像
docker images
- 也可通过以下方式查看单个镜像:
docker images $mirror-name
- 删除镜像
docker rmi $mirror-name
- 查看容器
docker ps
- 查看全部容器
docekr ps -a
- 查看容器日志
docker logs $container-name
启动容器操作相关
- 生成容器
可以通过以下方式生成一个基于某一镜像的容器,注意,如果宿主机中没有该镜像则会先进行下载。务必注意镜像标签是否正确。
docker run $mirror-name:$tag
使用这一命令会使得容器在创建后自动启动。
- 给容器添加自定义名字
Docker 会为其随机生成 64 位长度的字符串作为 ID,当然,我们也可以通过如下方式手动指定容器的名字,其中 $container-name 即为指定的容器名。
docker run --name $container-name $mirror-name
- 启动容器
docker start $container-name
- 关闭容器
docker stop $container-name
- 以交互方式创建容器
可以通过以下方式,以交互的方式创建容器,当然也可以在 $mirror-name 的前面加上 –name xxx 来指定容器的名字,在交互模式中,可以输入 exit 退出
docker run -it $mirror-name
使用 -d 操作使容器在后台运行:
docker run -d $mirror-name
容器状态问题
容器在启动后,如果没有活动的前台进程,容器会自动关闭。若要保持容器启动状态,可以强制其执行一个前台进程。
可以用以下方式创建一个不自动关闭的 centos 镜像:
docker run -it --name mycentos centos
docker start mycentos
// 此时可以看到该容器没有自动关闭
docker ps
- 容器执行操作
我们可以通过以下方式对已经启动的容器执行一些操作,其中 $container-name 可以是容器的名字,也可以是容器的 ID:
docker exec $container-name echo "hello" && echo "world"
也可以通过以下方式进入交互模式:
docekr exec -it $container-name bash
其中,&& 是起到操作间连接的作用。此外,我们也可以在创建的容器的时候就使其执行一些操作:
docker run $mirror-name echo "hello world"
- 查看容器详情
docker inspect $container-name
- 删除容器
可以在 rm 之后加入一个或多个容器名或容器 ID 进行批量删除。
docker rm $container-name-1 $container-name-2 ...
可以使用以下方法删除全部容器:
docker rm $(docker ps -aq)
Docker 网络
网络的类别为 none,host,bridge 三种,可以通过以下方式查看:
docker network ls
none 型网络
顾名思义,此类网络表示容器为独立个体,不与外部通信。
host 型网络
此类网络表示该容器与宿主机(安装 Docker 的机器)共享网络。
bridge 型网络
这是容器的默认网络类型,网桥模式意味着容器间可以互相通信,而对外的通信需要借助宿主机,这一形式通常表现为端口号的映射。
- 查看网络类别详情
docker network inspect $network-name
- 创建网络
可以通过以下方式创建一个网络,其中, network−driver表示网络类别,即none或bridge或host,而 network-name 为自定义的网络名
docker network create --driver $network-driver $network-name
如果省略 –driver $network-driver 则默认创建 bridge 类型的网络。
- 为容器指定网络
我们可以创建自定义的网络环境,并将一些容器放入这一网络内,以此管理容器间的网络连通情况。这种局域网网段的模拟实际是++由内部 DNS 实现++的。以下罗列将容器添加或移除到某一网络中的方法。
- 将容器添加进某一网络
docker network connect $network-name $container-name
- 将容器从某一网络中移除
docker network disconnect $network-name $container-name
- 在容器生成时指定网络
我们也可以在容器生成时指定网络,使用如下方法:
docker run --network $network-name $mirror-name
- 测试网络连通情况
可以通过以下方式查询到容器的 IP 地址:
1. 在容器交互模式中使用 ip addr ;
2. 使用 docker inspect $container-name
3. 使用 docker inspect $container-name | grep IPAddress
之后可以使用 ping 指令测试容期间的网络连通情况。没有 ping 命令的容器需要安装 iputils。
- 删除网络
docker network rm $network-name
Docker 存储
- 指定数据卷
在创建时,可以将系统的某一目录指定为容器某一目录的数据卷,其中 –volume 可以使用 -v 缩写
docker run --volume /my/mac/dir:/container/dir $mirror-name
此时,容器内部的 /container/dir 将与宿主机的 /my/mac/dir 形成映射。
当然也可以将文件与文件映射起来:
docker run --volume /my/mac/file:/container/file $mirror-name
在指定数据卷时,可以省略宿主主机目录,此时 Docker 会自动指定一个主机空间用以映射:
docker run --volume /container/dir $mirror-name
此外,还可以选择只读方式,这样文件或目录的修改就只能在宿主机中进行了。只需添加 :ro 即可:
docker run --volume /my/mac/dir:/container/dir:ro $mirror-name
可以通过 docker inspect $container-name,并在 Mounts 中看到数据卷的详细情况。
- 查看数据卷
docker volume ls
当容器被删除时,主机上的数据卷并不会被删除,此时可以通过以下指令查看那些没有容器使用的数据卷,注意,这里只会显示那些由 Docker 自动指定的数据卷,即没有手动指定主机映射目录的数据卷:
docker volume ls -f dangling=true
如果需要在删除容器时一并删除数据卷,可以使用以下指令:
docker rm -v $container-name
- 数据卷的继承
有时可能需要在创建容器时,选择该容器的数据卷与之前的某容器相同,比如在面对多容器共享项目目录空间这一需求时。此时我们可以通过以下方式实现:
docker run --volumes-from $container-name $mirror-name
- 数据卷的删除
docker volume rm $volume-id
Docker 端口
- 绑定端口
通过以下方式可以实现端口绑定,其中 host−port为宿主主机的端口,而 container-port 为容器的端口
docker run -p $host-port:$container-port nginx
也可以只指定容器的端口号,此时 Docker 会自动分配一个主机上的端口号:
docker run -p $container-port nginx
对于 Nginx,官方镜像在制作时指定暴露 80 和 443 端口用于 http 和 https 请求,对于这种在镜像中暴露的端口,可以在创建时使用以下方式全部指定:
docker run -P nginx
此时,Docker 会自动分配主机上的两个端口分别映射容器的 80 和 443 端口。自动分配的数量与镜像中暴露的端口数量对应。
- 查看端口
可以在 docker ps -a 中的 PORTS 栏看到端口映射情况。注意++只有处于运行中的容器才会有实际的端口映射++。
还可以使用以下指令查看某一容器的端口映射:
docker port $container-name
docker-compose
创建一个容器时,可能需要对多项参数进行限制,比如指定网络、指定数据卷、指定端口等等。而且,有时我们可能需要同时使用多个容器共同支撑应用,比如 Nginx 容器、php & php-fpm 容器、MySQL 容器、Redis 容器等。
如果每次都使用各种参数,按某种顺序依次启动容器(容器之间可能存在先后顺序,比如要先启动 PHP 然后再启动 Nginx 容器)的话,会造成很多繁琐的操作。为了解决这个问题,我们可以使用 docker-compose。
执行以下指令查看 docker-compose 可以执行的指令:
docker-compose --help
- YAML
docker-compose 依赖一个 docker-compose.yml 文件,用以指定容器数据卷、网络等。
.yml 文件遵循 YAML 语法,这是一种使用缩进的语法。
样例
下面给出一个简单的样例,用以说明 docker-compose 的用法
version: '2.0'
services:
# 启用一个镜像为 nginx 的容器并命名为 web1
web1:
image: nginx
# 开启 80 和 443 端口,实际映射端口由 Docker 指定
ports:
- "80"
- "443"
# 将该容器加入 mynetwork 中
networks:
- "mynetwork"
# 指定该容器要在 web2 容器启动之后启动,且在其停止前停止
depends_on:
- web2
web2:
image: nginx
ports:
- "33333:80"
networks:
- "mynetwork"
- "bridge"
volumes:
- "/mnt"
networks:
# 创建一个驱动为 bridge 的网络,命名为 mynetwork
mynetwork:
driver: bridge
docker-compose 的使用
- 生成容器
首先,需要有一个名为 docker-compose.yml 或 docker-compose.yaml 的文件,并进入该文件所在目录下,通过以下命令生成并启动:
docker-compose up
- 停止
docker-compose stop
- 运行
docker-compose start
- 查看日志
docker-compose logs
- 删除
通过以下命令可以删除容器,但不会删除之前创建的网络
docker-compose rm
若想既删除容器,又删除网络,可以使用:
docker-compose down
生成 & 提交镜像
- 生成镜像
docker commit -m $commit-msg -a $author $container-id $namespace/$mirror-name:$tag
如:
docker commit -m 'install nginx' -a 'dailybird' abcd1234 dailybird/nginx:test
之后便可以通过 docker images 查看已经创建的镜像。
需要在 Docker Hub 上注册账户:https://hub.docker.com/
- 提交镜像
docker push $namespace/$mirror-name:$tag
Dockerfile
Dockerfile 可以指定新镜像的原镜像来源、对原镜像的操作、环境变量,以及以此创建容器时执行的指令等
示例
# 新镜像基于的原镜像
FROM centos:centos6.8
# 指明维护者
MAINTAINER dailybird <dailybird@mail.com>
# 设置一些环境变量,使用 \ 表示连接多个设置
ENV NGINX_VERSION 1.11.11 \
TEST_ENV hello
# 指定暴露的端口号,
EXPOSE 80 443
# 在原镜像基础上进行的修改
RUN yum install -y wget iputils \
&& wget http://nginx.org/download/nginx-1.11.11.tar.gz
# 以此镜像创建并启动时,容器执行的指令,通常用于启动服务
CMD ["echo", "hello world"]
比如使用以下配置可以在 centos 中安装 nginx:
FROM centos:centos6.8
MAINTAINER dailybird <dailybird@mail.com>
EXPOSE 80 443
RUN cd / \
&& mkdir data \
&& cd data \
&& mkdir nmp \
&& cd nmp \
&& yum install -y wget pcre-devel gcc gcc-c++ \
ncurses-devel perl make zlib zlib-devel \
openssl openssl--devel iputils \
&& wget http://nginx.org/download/nginx-1.11.11.tar.gz \
&& tar zxf nginx-1.11.11.tar.gz \
&& cd nginx-1.11.11 \
&& ./configure --prefix=/usr/local/nginx \
&& make && make install && make clean \
- Dockerfile 的使用
使用 Dockerfile 创建镜像
首先,我们需要新建一个名为 Dockerfile 的文件(没有后缀),并写入一些配置内容。然后在该文件的目录中,通过以下指令创建镜像:
docker build --tag $namespace/$mirror-name:$tag $dockerfile-dir
其中,$dockerfile-dir 为 Dockerfile 所在目录,比如执行:
docker build --tag dailybird/nginx-demo:demo ./
等待一段时间之后,便可通过 docker images 看到新创建的镜像了。
docker-compose 中使用 Dockerfile
当我们需要启动一个新镜像时,可以先将此镜像创建出来,然后在 docker-compose.yml 文件中通过 image 指定新镜像;也可以直接通过以下方式将这两个步骤合并:
version: '2.0'
services:
web1:
# build 后的参数为 Dockerfile 文件所在的目录位置,替换原先的 image
build: ./
ports:
- "80"
networks:
- "mynetwork"
# ...
# 其他配置
此后,可以通过以下指令创建容器:
docker-compose build
docker-compose up
或者直接执行:
docker-compose up --build
问题备忘
- 权限问题
有时可能遇到如下 Docker 报错:
WARNING: Error loading config file:/home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied
此时,可以通过以下方法解决:
sudo chmod -R g+rwx /your/path/to/.docker/
关于 Docker 还有很多内容,比如备份、集群、插件等.