目录
- Docker 使用
- CentOS
- 设置镜像源
- yum缓存
- Ubuntu
- 把当前用户添加到docker用户组
- Docker 镜像使用
- Docker 容器使用
- 示例
- 运行一个web应用
- 常用命令
Docker使用
CentOS
设置镜像源
cd /etc/docker/
vi daemon.json
systemctl daemon.json
systemctl daemon-reload
systemctl restart docker
yum缓存
我们在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存
- yum makecache fast
这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度 - yum clean all
yum 会把下载的软件包和header存储在cache中而不自动删除。如果觉得占用磁盘空间,可以使用yum clean指令清除缓存。
Ubuntu
把当前用户添加到docker用户组
- 创建docker用户组
- sudo groupadd docker
- 将普通用户加入docker用户组
- sudo usermod -a -G docker $USER
- sudo gpasswd -a ${USER} docker
- 重启docker服务
- sudo service docker restart
- 刷新docker组成员
- newgrp - docker
Docker镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载
- 管理和使用本地 Docker 主机镜像
- 创建镜像
列出镜像列表
docker images
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 python 仓库源里,有 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -dit ubuntu:15.10 /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull
命令来下载它。
docker pull kafka
下载完成后,我们可以直接使用这个镜像来运行容器。
查找镜像
我们可以从 Docker Hub 网站来搜索适合我们的镜像.
docker search kafka
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
下载完成后,我们就可以使用这个镜像了
docker run -d kafka
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
- 载入镜像
1. 从已经创建的容器中更新镜像,并且提交这个镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -it kafka /bin/bash
在运行的容器内使用 apt-get update 命令进行更新。
退出这个容器:
exit
此时 ID 为 c2c789d2d3c5 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本
docker commit -m="has update" -a="blue" c2c789d2d3c5 blue/kafka:v2
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
c2c789d2d3c5:容器 ID
blue/kafka:v2: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 blue/kafka:v2
docker images
使用我们的新镜像来启动一个容器
docker run -dit blue/kafka:v2 /bin/bash
2. 使用 Dockerfile 指令来创建一个新的镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。
为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
3. 载入镜像
我们有了本地的镜像文件,可将本地保存的镜像再次导入docker中
docker load < xxx.tar 同 docker load --input xxx.tar 简写 docker load -i xxx.tar
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
保存镜像
docker save -o xxx.tar xxx_tag
xxx.tar:保存到本地的镜像名称; xxx_tag: 镜像名字
虚悬镜像没有用处,删除
$ docker rmi $(docker images -q -f dangling=true)
Docker容器使用
docker ps
参数说明:
-a: 所有运行状态的容器信息。
-q: 只显示容器ID。
docker pull xxx
docker run -it xxx /bin/bash
参数说明:
-i: 交互式操作
-t: 终端
ubuntu: ubuntu 镜像
/bin/bash 或 bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell
要退出终端,直接输入:
exit
启动已停止运行的容器
$ docker ps -a
$ docker start <容器 ID>
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
参数说明:
- -i: 进入交互式操作
- -t: 终端
- -d: 后台运行 detach分离
- --name: 给容器起别名,你忘了,docker会随机生成
- -p 无参数: 将容器内部使用的网络端口随机映射到我们使用的主机上
- -p 主机port:容器内部port 将容器内部使用的网络端口映射到我们使用的主机网络端口
给容器重命名
docker rename
stop停止一个容器
$ docker stop <容器 ID>
stop停止所有容器
$ docker stop $(docker ps -a -q)
停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
exec 命令
docker exec -it 243c32535da7 /bin/bash
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令
$ docker export 1e560fca3906 > ubuntu.tar
这样将导出容器快照到本地文件。
镜像导入和容器导入的区别:
- 容器导入 是将当前容器 变成一个新的镜像
- 镜像导入 是复制的过程
删除容器
删除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906
清理掉所有处于终止状态的容器。
$ docker container prune
remove删除所有容器
$ docker rm $(docker ps -a -q)
示例
创建容器
docker run --privileged -itd -p 8888:22 --name centos7 9f38484d220f /usr/sbin/init
docker run -itd --name centos7.6 -p 8888:22 --privileged=true REPOSITORY_or_IMAGE_ID /usr/sbin/init
----privileged 启动后让docker容器具备超级特权。
-itd 交互式、终端、后台运行
-p 把宿主机的8888端口映射到docker的22端口。
宿主机就是运行docker的机器,这样访问宿主机IP:8888端口,实际访问的是docker的22端口。
--name 给启动的容器命名,方便后续操作
9f38484d220f 就是IMAGE ID
注意:--privileged 和/usr/sbin/init是必须的,否则会报错。
我之前这里使用的是/bin/bash命令,docker中安装完httpd服务后,
使用命令systemctl start httpd.service启动ssh服务时会报错:
Failed to get D-Bus connection: Operation not permitted
进入centos7.6镜像, 并配置ssh服务
进入容器
docker exec -it centos7 /bin/bash
安装openssh
yum install -y openssh-server openssh-clients
- 启动openssh
systemctl start sshd - 设置root密码
passwd - 退出容器
exit - 登录测试
退出后进入宿主机,通过下面命令ssh连接8888端口,实际就是docker的22端口。提示输入密码后,进入docker环境内部
运行一个web应用
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
参数说明:
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上。
查看 WEB 应用容器
使用 docker ps 来查看我们正在运行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用: 127.0.0.1:32769
我们也可以通过 -p 参数来设置不一样的端口:
$ docker run -d -p 5000:5000 training/webapp python app.py
查看正在运行的容器: docker ps
runoob@runoob:~# docker ps
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。
网络端口的快捷方式
通过 docker ps 命令可以查看到容器的端口映射,
docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
查看WEB应用程序容器的进程
docker top 容器ID
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。
它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect 容器ID
Docker容器启动的时候,容器内部的目录如果要挂载宿主机的一个目录,可以用-v参数指定。
docker run -itd --rm --name username_container_version -p 5005:5005 -v /home/web/pro:/Project/pro image_name /bin/bash
冒号":"前面的目录是宿主机目录,后面的目录是容器内目录,在 Dockerfile 的 WORKDIR。
常用命令
列出所有的容器
docker ps -a
列出所有的容器IDs
docker ps -aq
列出所有的镜像
docker images
列出所有的镜像IDs
docker images -q
停止容器
docker stop CONTAINER-ID
先删除引用镜像的容器
docker rm CONTAINER-ID
再删除这个镜像
docker rmi -f IMAGE-ID
停止所有的容器
docker stop $(docker ps -aq)
删除所有的容器
docker rm -f $(docker ps -aq)
删除所有的镜像
docker rmi -f $(docker images -q)
从Dockerfile文件的所在目录, 构建镜像
docker build -t django_myproject .
运行docker容器,--rm 停止容器后自动删除容器
docker run -itd -p local-port:docker-container-internal-port --name 容器-REPOSITORY-name 镜像-REPOSITORY-name:TAG
进入容器
docker exec -it docker-ID bash
退出容器
exit
查看docker日志
docker logs docker-ID