0. 仓库:
1. 镜像:
2. 容器:
---------------------------
docker vs vmware
---------------------------
一.镜像相关命令:
1. Usage: docker search 名字 //搜索镜像
例如: docker search centos7
2. Usage: docker pull 镜像名:tag //下载镜像
例如: docker pull centos7
3. Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] //更改镜像名:标签名
例如: docker tag docker.io/nickistre/centos-lamp:latest lamp:lamp
4. Usage: docker save oldIMAGE [OPTIONS] newIMAGE //将镜像导出到本地
例如: docker save docker.io/nickistre/centos-lamp -o lamp01
5. Usage: docker load -i 镜像名 //将加载本地镜像文件
例如: docker load -i lamp03
6. docker images //查看所有已经下载的镜像
7. docker inspect 镜像ID //查看指定镜像的相关信息
8. docker rmi 镜像ID|镜像名 //删除镜像名
保存和加载:
docker save ...
docker load ...
二.容器相关命令:
1. Usage: docker ps -a //查看所有容器
2. Usage: docker ps //查看正在运行的容器
3. Usage: docker rm 容器ID|容器名 //删除容器
4. Usage: docker create -it 镜像名|镜像ID /bin/bash //通过指定镜像名创建容器
[root@Docker images]# docker create -it 57d8c48a14b1 /bin/bash
56606f50d1d09d1050e9cb6c51af5d7751daf53c15d65b01f016a11d6a9a3b24
[root@Docker images]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56606f50d1d0 57d8c48a14b1 "/bin/bash" 6 seconds ago Created jovial_murdock
[root@Docker images]#
5. Usage: docker start|stop 容器ID|容器名 //打开|停止容器
6. Usage: docker export old容器ID|old容器名 -o newContainer //将容器导出到文件
例如: docker export 05af39e8b263 -o newContainer //将容器05af39e8b263导出为文件newContainer
7. Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] //将容器导入变成一个镜像
例如: docker import newContainer //将本地的之前导出的文件newContainer变成一个镜像
导入和导出:
docker import ...
docker export ...
三. 运行和管理容器
1. Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] //进入到容器,需要提前开启容器
例如: docker exec -it 56606f50d1d0 /bin/bash
2. Usage: docker run -itd 镜像ID|镜像名 /bin/bash
例如: docker run -itd -p 12345:80 httpd:latest /bin/bash //通过镜像httpd生成容器,并指定本地12345端口映射到容器80端口
3. Usage: docker run -d -v /data01:/data01 -v /data02:/data02 --name web httpd:centos //创建一个名为web的容器,在宿主主机创建数据卷/data01和/data02,分别挂载到容器里面,并与宿主机的/data01,/data02关联
4. 根据镜像docker.io/centos创建一个打开的容器web005
Usage: docker run -itd --name web005 docker.io/centos /bin/bash //容器名为web005,后台运行web005
Usage: docker run -it --name web005 docker.io/centos /bin/bash //容器名为web005,前台运行web005
5. 容器间共享数据
Usage: docker run -it --volumes-from web --name db01 httpd:latest //web为源容器,db01为生成容器
6. 端口映射
Usage: docker run -d -P httpd:latest //docker随机映射一个端口范围49000-49900的端口到容器内部开发的网络端口
Usage: docker run -d -p 49888:80 httpd:latest //docker指定端口映射
7. 容器互联--通过容器的名称在容器间建立一条专门的网络通信隧道,
在源容器和接收容器之间建立一条隧道,接收容器看到源容器指定的信息
docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,
并且接收容器可以获取源容器的一些数据,如源容器的环境变量
--link的格式:
--link <name or id>:alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
Usage:
7.1 docker run -d -P --name source_web01 httpd:latest //创建源容器
7.2 docker run -d -P --name destination_web02 --link source_web01 httpd:latest //创建容器并链接到源容器
8. 创建一个新的 Docker 网络。
docker network create -d bridge test-net #网络名称为test-net
docker run -itd --name test1 --network test-net ubuntu /bin/bash #为指定创建的容器指定网络
9.在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
10.在指定的容器设置 DNS,则可以使用以下命令:
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
12. 创建一个名称为web99,容器的主机名为vm_web1,容器的dns指向114.114.114.114;容器退出时自动清理容器内部的文件系统
docker run -it --name web99 -h vm_web1 --dns 114.114.114.114 --rm lamp /bin/bash
四. docker镜像创建方法
基于已有运行的容器创建:
基于本地模板创建
基于Dockerfile创建
1. 基于已有运行的容器创建<docker commit ...>: 把一个容器里面运行的程序及其运行环境打包生成新的镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
例如: docker commit --help //查看命令帮助
[root@Docker ~]# docker commit -a "vmsysjack" -m "Hello,Everyone" -p 56606f50d1d0 vm1:vm2 //将容器56606f50d1d0打包成为一个镜像,名称为vm1,tag为vm2
2. 基于本地模板创建:
2.1. 从网上下载模板
2.2. cat 模板文件 | docker import - 镜像名:tag名
3. 基于Dockerfile创建: 使用dockerfile自动生成镜像,dockerfile由一组指令组成的文件
1.基础镜像信息
dockerfile 2.维护者信息
组成部分 3.镜像操作指令
4.容器启动时执行指令
vim dockerfile
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,
其中包含一组指令来告诉 Docker 如何构建我们的镜像。
开始构建:
docker build -t hello:latest . #在dockerfile文件目录下构建镜像文件
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
-------------------------------
#第一行必须指明基于的基础镜像
FROM centos
#维护该镜像的用户信息
MAINTAINER The Centos Project
#镜像操作指令
RUN yum -y update
RUN yum install -y openssl-server
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#开启22端口
EXPOSE 22
#启动容器时执行指令
CMD ["/usr/sbin/sshd","-D"]
--------------------------------
命令解释:
from镜像: 指定新镜像所基于的镜像,每创建一个镜像就需要一条FROM指令
maintainer名字: 说明新镜像的维护人信息
run命令: 在所基于的镜像上执行命令,并提交到新的镜像中
cmd["要运行的程序","参数1","参数2"]: 指令启动容器时要运行的命令或者脚本,dockerfile只能有一条CMD命令,指定多条则只能最后一条被执行
expose端口号: 指定镜像加载到docker时要开启的端口
ENV环境变量变量值: 设定一个环境变量的值,会被后面的RUN使用
add 源文件 /目录目标文件/目录: 将源文件复制到目标文件,源文件要与dockerfile位于相同目录中,或者是一个URL
copy 源文件 /目录目标文件/目录: 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
volume["目录"]: 在容器中创建一个挂载点
user 用户名/uid: 指定运行容器时的用户
workdir 路径: 为后续的RUN,CMD,ENTRYPOINT指定工作目录
例如: workdir /root/nginx 进入到真实机/root/nginx
onbuild 命令: 指定所生成的镜像作为一个基础镜像时所要运行的命令
############################################################################################
注意:
add run.sh /run.sh
cmd [ "/run.sh" ]
-----------------------------------
cmd [ "/usr/sbin/init" ] #表示在启动容器的时候自动加载/usr/lib/systemd/system/下的脚本文件
当使用cmd ["/usr/sbin/init" ]来加载配置文件后,再次使用docker run -it ... /bin/bash时,
容器不能够使用systemctl命令,只能够使用docker run -d ....
-----------------------------------
docker run -itd --privilged=true nginx:centos init /bin/bash (X)
--------------------------
############################################################################################