什么是Docker
Docker包括一个命令行程序、一个后台守护进程,以及一组远程服务。它通过Unix的容器技术解决了常见的软件问题,并简化了安装、运行、发布和删除软件。
容器不是虚拟化,Docker容器不使用硬件虚拟化,Docker容器中的程序接口和主机的Linux内核直接打交道,容器的运行与计算机操作系统之间没有额外的中间层。
Docker通过一种打包和分发的软件,完成传统容器的封装。这个充当容器分发角色的组件被称为镜像。Docker镜像是一个容器中运行程序的所有文件的捆绑快照。
Docker解决的问题
何时何处使用Docker
Docker应用范围限定在Linux服务器或桌面运行的软件,如Web服务器、邮件服务器、数据库、代理服务器等。
Docker仓库
完成镜像的传输
- hub.docker.com (速度慢)
- c.163.com (网易蜂巢 镜像中心)
- https://dev.aliyun.com/search.html (阿里镜像仓库)
- 镜像也可以搭建内网的镜像中心
Docker命令
docker search <镜像名字> 搜索可用的docker镜像
docker pull <镜像名字> 下载镜像
docker ps 可以查看当前在这台机器上运行的容器
docker ps -a 查看所有镜像信息
docker ps -aq 查看所有镜像的id
docker ps -q 查看所有镜像的id
docker run -d <镜像名> 在后台运行容器,并返回容器的id -d是detach的缩写
docker run --help 查看docker run的参数
docker exec 进入容器内部 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -i 保证我们的输入有效
docker exec -t 分配一个伪终端
docker exec -it f4 两个命令一起运行 由于当前容器运行的镜像非常的少,它就可以通过前两个id判断出是哪个镜像,从而进入这个容器
docker exec 镜像的名称或ID 运行的命令
docker exec -it f4<名字或id> bash 切换到容器内部
docker search <镜像名字> 搜索可用的docker镜像
docker exec -ti <镜像id> /bin/bash 进入后台容器并提供bash
docker stop <镜像的id或名字> 停掉当前的镜像
docker start <镜像的id或名字> 启动镜像
docker restart <镜像的id> 重启docker容器
docker rmi <镜像名称> <镜像名称>.. 删除一个或者多个镜像
docker rmi -f <镜像名称> -f = --force 强制删除镜像
docker ps -a 查看所有容器(包括stop的容器)
docker rm <容器id> 删除指定id的容器
docker stop $(docker ps -q) 停用全部运行中的容器
docker rm $(docker ps -aq) 删除全部容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq) 一条命令实现停用并删除容器
更新镜像
1.更新镜像之前,我们需要使用镜像来创建一个容器。
2.在运行的容器中使用 apt-get update 命令进行更新,在完成操作之后输入exit命令退出容器。
3.通过docker commit命令来提交容器副本。
docker commit -m="has update" -a="tomato" <镜像id> tomato/ubuntu:v2
各个参数说明:
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID
tomato/ubuntu:v2:指定要创建的目标镜像名
Docker的网络
Bridge 桥接<默认情况>端口映射
Host 利用主机的IP和端口号
None 不与外界通信
构建镜像
- Dockerfile 用来告诉Docker,我制作镜像的每一个步骤
- docker build 执行Dockerfile中所描述的每一件事情
使用命令 docker build,从零开始来创建一个镜像,我们需要创建一个Dockerfile文件,其中包含一组命令来告诉Docker如何构建镜像。首先创建一个空白的文件夹,mkdir myDocker
FROM centos:6.7
MAINTAINER tomato "XXX@XXX.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条指令FROM,指定使用哪个镜像源
RUN指令告诉Docker在镜像内执行命令,安装了什么
然后,使用Dockerfile文件,通过docker build命令构建一个镜像。
$ docker build -t tomato/centos:6.7 .
参数说明:
-t:指定创建的目标镜像名
.:Dockerfile文件所在目录,可以指定Dockerfile的绝对路径
当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。
所以命令 docker build -t tomato/centos:6.7 . 中的这个 . ,实际上是在指定上下文的目录, docker build 命令会将该目录下的内容打包交给Docker 引擎以帮助构建镜像。
如果观察 docker build 输出,我们其实已经看到了这个发送上下文的过程:
$ docker build -t tomato/centos:6.7 .
Sending build context to Docker daemon 2.048 kB
...
理解构建上下文对于镜像构建是很重要的,避免犯一些不应该的错误。比如将 Dockerfile 放到了硬盘根目录去构建,结果发现 docker build 执行后,在发送一个几十 GB 的东西,极为缓慢而且很容易构建失败。那是因为这种做法是在让 docker build打包整个硬盘,这显然是使用错误。
<!- end ->