docker基础
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) -------------------------- ############################################################################################