docker笔记基础知识
1.docker概述
docker是通过内核(指linux内核)虚拟化技术(namespace及cgroups等)来提供容器的资源隔离与安全保障等。
由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。在非linux平台无法使用docker,docer是c/s架构
2.常见架构
c/s架构: client端和server端
b/s架构: 浏览器端和server端
3.docker组成和组件
docker组成:client端和server端
docker组件: 镜像(image)、容器(container,也叫实例或虚拟机)、仓库(repository)
4.docker和OpenStack的对比:
5.docer的安装:(在centos7下)
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@localhost ~]# systemctl stop firewalld.service #关闭防火墙
[root@localhost ~]# systemctl disable firewalld.service #禁止防火墙开机自启
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0 #此处是否关闭selinux和下面报错没关系,尽量关闭吧
[root@localhost ~]# yum -y install docker #安装docker
[root@localhost ~]# systemctl start docker #启动docker,下面错误
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
#注意包上面错,是因为此linux的内核中的SELinux不支持 overlay2 graph driver,解决方法:要么启动一个新内核,要么就在docker里禁用selinux,--selinux-enabled=false
[root@localhost ~]# vi /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false' #修改
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
……
[root@localhost ~]# systemctl start docker #启动docker成功
[root@localhost ~]# ps -ef |grep docker
root 17892 1 0 13:27 ? 00:00:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled=false --log-driver=journald --signature-verification=false --storage-driver overlay2
root 17897 17892 0 13:27 ? 00:00:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
root 17997 9842 0 13:28 pts/1 00:00:00 grep --color=auto docker
[root@localhost ~]# systemctl stop docker #停止docker
[root@localhost ~]# ps -ef |grep docker
root 18006 9842 0 13:29 pts/1 00:00:00 grep --color=auto docker
[root@localhost ~]# docker --version
Docker version 1.13.1, build 774336d/1.13.1
6.docker镜像管理 (搜索、下载、查看、删除镜像(镜像是各系统光盘))
1)docker下载镜像出错并解决:
[root@localhost ~]# docker search redhat #搜索网络镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/hjd48/redhat redhat6.3x86-64 images 12
docker.io docker.io/fbascheper/redhat-jboss-eap Extensible RedHat JBoss EAP 7
docker.io docker.io/yjjy0921/redhat7.2 A clean redhat 7.2 image from official red... 5
docker.io docker.io/aossama/redhat RHEL 7.0
………
[root@localhost ~]# docker pull docker.io/yjjy0921/redhat7.2 #下载镜像出错
Using default tag: latest
Trying to pull repository docker.io/yjjy0921/redhat7.2 ...
latest: Pulling from docker.io/yjjy0921/redhat7.2
16dc1f96e3a1: Pulling fs layer
error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/5f/5fbb74308f2db1a6c2fa06e72ede9fdd4ecf34754e8e9280e382b77652b470a3/data?Expires=1522352041&Signature=S1QY3Rsy6t37m2P~ZuSUl05c6ZEIlaUwWdeX~UCdMH-LIalYUyJpfr7ZspdHY4ERKMJLi8~JpFcWupyfAhOfj45uWetQlEjsWnvxJDdp3fPJfULfjRG8Dqte98C1updSD0S8YRqm2EFqhtepwrTVlPEFbn7e7feiauxD5sgQv8Y_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout
#注意:原因是因为国内网络问题,无法连接到 docker hub。 好在国内已经有daocloud,docker指定该源即可。centos7处理办法如下,其他系统版本处理方法类似,添加后重启docker 即可
解决方法:
[root@localhost ~]# vi /etc/sysconfig/docker
# /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false --registry-mirror=http://f2d6cb40.m.daocloud.io' #添加该源
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
……….
[root@localhost ~]# systemctl stop docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker pull docker.io/yjjy0921/redhat7.2 #下载镜像没有问题
[root@localhost ~]# docker images #查看下载的镜像,存到本地镜像仓库中
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/yjjy0921/redhat7.2 latest 5fbb74308f2d 21 months ago 204 MB
2)docker镜像管理
查看本地镜像:
[root@localhost ~]# docker images #查看本地镜像仓库下所有的镜像(已下载的),每个镜像都有一个唯一ID
REPOSITORY TAG IMAGE ID CREATED SIZE
搜索网络镜像:
[root@localhost ~]# docker search centos #搜索所有centos网络镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 4871 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 119 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x... 99 [OK]
docker.io docker.io/consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 67 [OK]
docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 47 [OK]
docker.io docker.io/tutum/centos Simple CentOS docker image with SSH access 43
……
[root@localhost ~]# docker search -s 40 tomcat #只搜索列出点赞数超过40的tomcat镜像
Flag --stars has been deprecated, use --filter=stars=3 instead
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/tomcat Apache Tomcat is an open source implementa... 2125 [OK]
docker.io docker.io/tomee Apache TomEE is an all-Apache Java EE cert... 58 [OK]
docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba... 49 [OK]
[root@localhost ~]# docker search -s 30 --no-trunc --automated tomcat #搜索点赞数超过30,且镜像信息完整,且AUTOMATED状态是ok的镜像
Flag --stars has been deprecated, use --filter=stars=3 instead
Flag --automated has been deprecated, use --filter=automated=true instead
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 based docker container. 49 [OK]
docker.io docker.io/davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 with GLIBC 2.21 over Alpine with unlimited JCE patch applied 31 [OK]
下载网络镜像:
[root@localhost ~]# docker pull centos #默认下载第一个镜像,若想下载其他就跟上绝对路径
[root@localhost ~]# docker pull docker.io/ansible/centos7-ansible #下载指定的镜像,跟路径
[root@localhost ~]# docker pull centos:6.8 #指定版本下载网络镜像
[root@localhost ~]# docker images #查看本地镜像仓库下所有的镜像(已下载的),所属仓库、标签、ID、创建时间、大小
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos 6.8 e54faac158ff 3 weeks ago 195 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
docker.io/ansible/centos7-ansible latest 688353a31fde 22 months ago 447 MB
本地查看镜像:
[root@localhost ~]# docker images -a #列出所有镜像,包括中间镜像层
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos 6.8 e54faac158ff 3 weeks ago 195 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
docker.io/ansible/centos7-ansible latest 688353a31fde 22 months ago 447 MB
[root@localhost ~]# docker images -q #只显示镜像ID(不包括中间镜像层)
e54faac158ff
75835a67d134
688353a31fde
[root@localhost ~]# docker images -qa #列出所有的镜像ID,包括中间镜像层
e54faac158ff
75835a67d134
688353a31fde
[root@localhost ~]# docker images --digests #显示镜像的摘要信息
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
docker.io/centos 6.8 sha256:5b1a8064eb59cfd1e1c48ede6644f0862ddf4aa60d20245abb439961ac8a4573 e54faac158ff 3 weeks ago 195 MB
docker.io/centos latest sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b 75835a67d134 3 weeks ago 200 MB
docker.io/ansible/centos7-ansible latest sha256:00284f8b7f0fb02bbcc99cf720a512f4c1e26404b59b6ea52fc255bd12d0a7fd 688353a31fde 22 months ago 447 MB
[root@localhost ~]# docker images --no-trunc #显示完整的镜像信息
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos 6.8 sha256:e54faac158ffc33e92a3fe1f59ccc0b8bbe375cf1b672537e2fbd2b7606beeb5 3 weeks ago 195 MB
docker.io/centos latest sha256:75835a67d1341bdc7f4cc4ed9fa1631a7d7b6998e9327272afea342d90c4ab6d 3 weeks ago 200 MB
docker.io/ansible/centos7-ansible latest sha256:688353a31fdee02a966d1f83e9210f77b5a63baaaacbedb81ca35f6231cfeb6c 22 months ago 447 MB
本地删除镜像:
[root@localhost ~]# docker rmi e54faac158ff #按镜像ID删除单个镜像
[root@localhost ~]# docker rmi e54faac158ff 75835a67d134 ... #按镜像ID删除多个镜像
[root@localhost ~]# docker rmi docker.io/centos #按镜像名字删除单个镜像(默认latest)
[root@localhost ~]# docker rmi docker.io/centos:6.8 #按镜像名字删除单个镜像(指定版本)
[root@localhost ~]# docker rmi docker.io/centos:6.8 docker.io/centos #按镜像名字删除多个镜像
[root@localhost ~]# docker rmi -f $(docker images -qa) #按镜像ID删除所有的镜像,包括中间镜像层
3.docker容器管理(下载镜像后通过镜像构建容器,然后运行和管理容器,创建、查看、启动、进入、停止、删除容器)
1)docker根据本地仓库中镜像导出一个镜像到指定位置以备用和根据镜像文件导入到本地仓库一个镜像
[root@localhost ~]# docker search centos #搜索镜像
[root@localhost ~]# docker pull centos #默认下载第一个镜像,也可指定搜索路径下载指定镜像
[root@localhost ~]# docker images #查看本地镜像仓库中下载好的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker save docker.io/centos > /opt/centos.tar.gz #据本地下载好的镜像导出一个镜像文件到指定位置
[root@localhost ~]# ls /opt/
centos.tar.gz
[root@localhost ~]# docker rmi 75835a67d134 #删除本地仓库中的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker load < /opt/centos.tar.gz #根据已有镜像文件导入镜像到本地镜像仓库
[root@localhost ~]# docker images #查看本地镜像仓库中下载好的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
2)管理容器(根据镜像创建、查看、启动、进入、停止、删除容器)
启动容器有两种启动方式:a)已经有了一个容器,把他起来,b)事先没有容器,我创建一个新容器,然后把他起来
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker ps -a #查看容器,现在还没有构建启动容器(加-a查看所有容器,不加只查看运行的)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
创建容器:(简单创建,后面项目是实际工作中的创建)
[root@localhost ~]# docker run --name mydocker -it docker.io/centos /bin/bash #根据镜像创建一个容器并进入容器
--name指定一个容器名字 , -t指定一个尾终端供登录进来, -i让容器标准输入保持打开状态,/bin/bash表示执行命令是在/bin/bash下,(也可不用写/bin/bash,镜像打包时Dockerfile文件最后一行一般有一个命令就是/bin/bash)
[root@1f2bf125c7ae /]# ps aux #该创建的容器目前只运行了一个进程:/bin/bash
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.3 0.1 11824 1888 ? Ss 03:11 0:00 /bin/bash
root 13 0.0 0.1 51712 1708 ? R+ 03:12 0:00 ps aux
[root@1f2bf125c7ae /]# hostname
1f2bf125c7ae
[root@1f2bf125c7ae /]# exit #退出容器,此种方式进入的容器,退出容器后,容器也自动终止
[root@localhost ~]# docker ps -a #查看容器(加-a查看所有容器,不加只查看运行的)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" About a minute ago Exited (0) 24 seconds ago mydocker
[root@localhost ~]# docker start 1f2bf125c7ae/mydocker #启动已经存在的容器,docker start 容器ID/容器名
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 3 minutes ago Up 5 seconds mydocker
[root@localhost ~]# docker attach 1f2bf125c7ae #进入容器方式1,但退出后,容器也停止(不推荐)
[root@1f2bf125c7ae /]# exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 4 minutes ago Exited (0) 2 seconds ago mydocker
[root@localhost ~]# docker start 1f2bf125c7ae
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 5 minutes ago Up 3 seconds mydocker
[root@localhost ~]# docker inspect --format "{{.State.Pid}}" 1f2bf125c7ae #根据容器ID获取启动容器进程的pid
13985
[root@localhost ~]# nsenter -t 13985 -u -i -n -p #进入容器方式2,用nsenter命令通过容器PID进入容器,退出后容器不停止(但也不推荐)
#格式:nsenter -t 启动容器的PID号 -u -i -n -p #-u用户空间,-i指IPC空间,-n指网络空间,-p指pid的namespace,
[root@localhost ~]# nsenter -t 13985 -u -i -n -p
[root@1f2bf125c7ae ~]# hostname
1f2bf125c7ae
[root@1f2bf125c7ae ~]# exit
[root@localhost ~]# docker ps -a #这种进入容器的方式,退出后容器不停止
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 8 minutes ago Up 2 minutes mydocker
可以将该命令写成一个进入容器的脚本,供使用:(使用脚本进入已经运行的容器,并退出容器后,容器不停止)
[root@localhost ~]# cat ns.sh
#!/bin/bash
PID=$(docker inspect --format "{{.State.Pid}}" $1) #根据容器ID获取启动容器进程的pid,$1接收容器ID号
nsenter -t $PID -u -i -n -p #进入容器方式2,用nsenter命令通过获得容器的PID进入容器,退出后,容器不停止(推荐)
[root@localhost ~]# chmod +x ns.sh
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c1431b52f5b docker.io/centos "/bin/bash" 42 minutes ago Up 17 minutes mydocker
[root@localhost ~]# ./ns.sh 1f2bf125c7ae
[root@1f2bf125c7ae ~]# hostname
1f2bf125c7ae
[root@1f2bf125c7ae ~]# exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 10 minutes ago Up 5 minutes mydocker
#注意:若没有nsenter命令需要装下面的包 yum -y install util-linux
[root@localhost ~]# docker exec -it 1f2bf125c7ae或mydocker /bin/bash #进入容器方式3,退出容器后容器不停止(最推荐)
[root@1f2bf125c7ae /]# hostname
1f2bf125c7ae
[root@1f2bf125c7ae /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f2bf125c7ae docker.io/centos "/bin/bash" 11 minutes ago Up 6 minutes mydocker
查看容器:
#再创建几个容器,供演示查看容器命令:
[root@localhost ~]# docker run -d --name mydocker2 -it docker.io/centos /bin/bash
[root@localhost ~]# docker run -d --name mydocker3 -it docker.io/centos /bin/bash
[root@localhost ~]# docker run -d --name mydocker4 -it docker.io/centos /bin/bash
[root@localhost ~]# docker run -d --name mydocker5 -it docker.io/centos /bin/bash
[root@localhost ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e7d0011fb9 docker.io/centos "/bin/bash" 34 seconds ago Up 34 seconds mydocker5
29c7e6e8b2b9 docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker4
1e2647191ca1 docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker3
9cf8c48efd3b docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker2
1f2bf125c7ae docker.io/centos "/bin/bash" 18 minutes ago Up 13 minutes mydocker
[root@localhost ~]# docker ps -a #查看所有的容器,正运行的和停止的都有
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e7d0011fb9 docker.io/centos "/bin/bash" 34 seconds ago Up 34 seconds mydocker5
29c7e6e8b2b9 docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker4
1e2647191ca1 docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker3
9cf8c48efd3b docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes mydocker2
1f2bf125c7ae docker.io/centos "/bin/bash" 18 minutes ago Up 13 minutes mydocker
[root@localhost ~]# docker ps -q #查看正在运行的容器ID(仅ID号)
11e7d0011fb9
29c7e6e8b2b9
1e2647191ca1
9cf8c48efd3b
1f2bf125c7ae
[root@localhost ~]# docker ps -aq #查看所有的容器ID(仅ID号)
11e7d0011fb9
29c7e6e8b2b9
1e2647191ca1
9cf8c48efd3b
1f2bf125c7ae
停止容器:
[root@localhost ~]# docker stop 1f2bf125c7ae/mydocker #根据容器的ID/容器名停止容器(优雅停止)
[root@localhost ~]# docker kill 9cf8c48efd3b/mydocker2 #根据容器的ID/容器名停止容器(强制停止)
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e7d0011fb9 docker.io/centos "/bin/bash" 14 minutes ago Up 14 minutes mydocker5
29c7e6e8b2b9 docker.io/centos "/bin/bash" 16 minutes ago Up 16 minutes mydocker4
1e2647191ca1 docker.io/centos "/bin/bash" 16 minutes ago Up 16 minutes mydocker3
9cf8c48efd3b docker.io/centos "/bin/bash" 16 minutes ago Exited (137) 40 seconds ago mydocker2
1f2bf125c7ae docker.io/centos "/bin/bash" 32 minutes ago Exited (137) 7 seconds ago mydocker
启动容器:
[root@localhost ~]# docker start 9cf8c48efd3b/mydocker2 #根据容器的ID/容器名启动
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e7d0011fb9 docker.io/centos "/bin/bash" 14 minutes ago Up 14 minutes mydocker5
29c7e6e8b2b9 docker.io/centos "/bin/bash" 16 minutes ago Up 16 minutes mydocker4
1e2647191ca1 docker.io/centos "/bin/bash" 16 minutes ago Up 16 minutes mydocker3
9cf8c48efd3b docker.io/centos "/bin/bash" 16 minutes ago Up 6 seconds mydocker2
1f2bf125c7ae docker.io/centos "/bin/bash" 32 minutes ago Exited (137) 7 seconds ago mydocker
删除容器:
[root@localhost ~]# docker rm 1f2bf125c7ae #根据容器的ID删除容器,(已停止的容器删除方法)
[root@localhost ~]# docker rm -f 1e2647191ca1 #根据容器的ID删除容器,(正运行的容器删除方法,很少这么干)
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e7d0011fb9 docker.io/centos "/bin/bash" 17 minutes ago Up 17 minutes mydocker5
29c7e6e8b2b9 docker.io/centos "/bin/bash" 19 minutes ago Up 19 minutes mydocker4
9cf8c48efd3b docker.io/centos "/bin/bash" 19 minutes ago Exited (137) 3 minutes ago mydocker2
[root@localhost ~]# docker rm -f $(docker ps -aq) #根据容器的ID删除所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
附加:做实验时候可以用,生产环境不建议使用
1)创建一个容器并测试后容器停止后就自动再删除该容器:
[root@localhost ~]# docker run --rm docker.io/centos /bin/echo "hello word"
hello word
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2)杀死所有正在运行的容器
[root@localhost ~]# docker kill $(docker ps -a -q)
4.docker容器网络访问(端口映射)(让容器里面的端口对外,使得外网能访问)
(端口映射有两种方法:随机端口映射和指定端口映射)
方法1:随机端口映射
在机器192.168.14.140上安装docker并构建容器,且做容器随机端口映射:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker search nginx
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/nginx Official build of Nginx. 10088 [OK]
docker.io docker.io/jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1441 [OK]
docker.io docker.io/richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 636 [OK]
……
[root@localhost ~]# docker pull docker.io/nginx #下载一个带nginx的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker run -d -P docker.io/nginx #根据带nginx的镜像创建一个容器,自动随机映射端口,-d后台运行不进入容器
a7c0598af3c3cb770fdd210d3b83c52c354595a78757c524c4d0110dbb767156
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7c0598af3c3 docker.io/nginx "nginx -g 'daemon ..." 21 seconds ago Up 19 seconds 0.0.0.0:32768->80/tcp lucid_bartik
#注意:0.0.0.0:32768->80/tcp,表示我用随机分配的端口32768对应自己的80端口
客户端通过容器映射的端口访问容器网站:格式:http://docker机器的IP:容器自动分配的端口(32768)
方法2:指定端口映射
在机器192.168.14.140上安装docker并构建容器,且做容器随机端口映射:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker search nginx
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/nginx Official build of Nginx. 10088 [OK]
docker.io docker.io/jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1441 [OK]
docker.io docker.io/richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 636 [OK]
……
[root@localhost ~]# docker pull docker.io/nginx #下载一个带nginx的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker run -d -p 81:80 docker.io/nginx #根据带nginx的镜像创建容器,指定映射端口,-d后台运行不进入容器
dbc1ca84bb5ff44e51943b2295bf30747d6c6b06d1439a158d3896cfe5b4ff2a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbc1ca84bb5f docker.io/nginx "nginx -g 'daemon ..." 3 seconds ago Up 3 seconds 0.0.0.0:81->80/tcp musing_noether
a7c0598af3c3 docker.io/nginx "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp lucid_bartik
#注意:0.0.0.0:81->80/tcp,表示我用随机指定的端口81对应自己的80端口
客户端通过容器映射的端口访问容器网站:格式:http://docker机器的IP:容器指定分配的端口(81)
即:http://192.168.14.140:81
5.docker的数据管理(数据卷和数据卷容器,注意:一般构建容器都要加数据对应关系,否则建立的容器是暂时的)
说明:类似nfs挂载,容器和物理机器建立一个数据对应目录的关系
1)根据镜像创建一个容器并将物理机的某个目录指定挂载到容器本地的/data目录中(建立数据目录对应关系)
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]#
[root@localhost ~]# docker run --name volume-test1 -it -v /data docker.io/centos #建容器并建立对应和物理机对应数据目录,/data是容器目录
[root@e5b50fec7fde /]# ls /data/
空 #进入容器中查看/data目录,此时还没有东西.
另开一个窗口:
[root@localhost ~]# docker ps -a #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5b50fec7fde docker.io/centos "/bin/bash" 38 seconds ago Up 36 seconds volume-test1
[root@localhost ~]# docker inspect e5b50fec7fde #根据容器ID查看物理机和容器的数据挂载目录对应关系
……………….
"Mounts": [
{
"Type": "volume",
"Name": "4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b",
"Source": "/var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data", #物理机数据目录
"Destination": "/data", #容器中的数据目录
……………….
进入物理数据目录中创建数据:
[root@localhost ~]# cd /var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data
[root@localhost _data]# touch aaa
[root@localhost _data]# ls
aaa
再从进入容器的窗口查看容器中的/data目录,发现有数据,再在容器的/data目录建立数据
[root@e5b50fec7fde /]# ls /data/
aaa
[root@e5b50fec7fde /]# touch /data/bbb
[root@e5b50fec7fde /]# ls /data/
aaa bbb
在另一窗口的物理目录中查看数据:
[root@localhost _data]# pwd
/var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data
[root@localhost _data]# ls
aaa bbb
2)根据镜像创建一个容器并手动指定将物理机的某个目录(/opt)挂载到容器本地的/opt目录中(建立数据目录对应关系,推荐)
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# ls /opt/
a.txt
[root@localhost ~]# docker run --name test -it -v /opt:/opt docker.io/centos #建容器,并建立和物理机对应的数据目录,物理机目录(src):容器目录(dst)
[root@c3a685be017d /]# ls /opt/
a.txt
[root@c3a685be017d /]# touch /opt/hehe
[root@c3a685be017d /]# ls /opt/
a.txt hehe
[root@c3a685be017d /]# exit
[root@localhost ~]# ls /opt/
a.txt hehe
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c3a685be017d docker.io/centos "/bin/bash" 51 seconds ago Exited (0) 33 seconds ago test
[root@localhost ~]# docker inspect c3a685be017d #根据容器ID查看物理机和容器的数据挂载目录对应关系
…………….
"Mounts": [
{
"Type": "bind",
"Source": "/opt", #物理机数据目录
"Destination": "/opt", #容器中的数据目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
…………….
#挂载目录时可以指定权限:(建容器,并建立和物理机对应的数据目录,下面若是ro,那么容器内目录只能读)
格式: docker run --name test -it -v /opt:/opt:ro或rw docker.io/centos
3)根据镜像创建一个容器test并手动指定将物理机的某个目录(/opt)挂载到容器本地的/opt目录中(建立数据目录对应关系),且建立一个别的容器test1,也使用该挂载的数据目录. 注意:映射可多个目录映射,目录没有会自建
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest dbfc48660aeb 2 weeks ago 109 MB
docker.io/centos latest 75835a67d134 3 weeks ago 200 MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# ls /opt/
a.txt
[root@localhost ~]# docker run --name test -it -v /opt:/opt docker.io/centos #建容器,并建立和物理机对应的数据目录,物理机目录(src):容器目录(dst)
[root@39b146f34293 /]# ls /opt/
a.txt
[root@39b146f34293 /]# touch /opt/hehe
[root@39b146f34293 /]# ls /opt/
a.txt hehe
[root@39b146f34293 /]# exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39b146f34293 docker.io/centos "/bin/bash" 34 seconds ago Exited (0) 15 seconds ago test
[root@localhost ~]# docker inspect 39b146f34293 #根据容器ID查看物理机和容器的数据挂载目录对应关系
…………….
"Mounts": [
{
"Type": "bind",
"Source": "/opt", #物理机数据目录
"Destination": "/opt", #容器中的数据目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
…………….
再创建一个容器test1,并使用刚才容器test的数据目录,并在新容器test1容器中建立一个数据:
[root@localhost ~]# docker run --name test1 -it --volumes-from test docker.io/centos
[root@86fa3708f65c /]# ls /opt/
a.txt hehe
[root@86fa3708f65c /]# touch /opt/haha
[root@86fa3708f65c /]# ls /opt/
a.txt haha hehe
[root@86fa3708f65c /]# exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86fa3708f65c docker.io/centos "/bin/bash" 35 seconds ago Exited (0) 15 seconds ago test1
39b146f34293 docker.io/centos "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago test
[root@localhost ~]# ls /opt/ #在对应的物理机上查看/opt下数据,有数据
a.txt haha hehe
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker attach test #进入原容器test中查看/opt下数据,也有数据
[root@39b146f34293 /]# ls /opt/
a.txt haha hehe
[root@39b146f34293 /]# exit
#挂载目录时可以指定权限:(建容器,并建立和物理机对应的数据目录,下面若是ro,那么容器内目录只能读)
格式: docker run --name test -it -v /opt:/opt:ro或rw docker.io/centos
基础知识补充:
1)以守护进程运行容器: docker run -d 容器ID/容器名
2)查看容器日志: docker logs -f -t --tail 容器ID
3)查看容器内部细节: docker inspect 容器ID
4)不进入容器,执行容器内的命令,结果返回给宿主机:
docker exec -it 容器ID 要执行的命令 #或 docker exec -t 容器ID 要执行的命令
如:docker exec -it 容器ID ls /tmp
5)从容器内拷贝文件到宿主机: docker cp 容器ID:容器内绝对路径 宿主机绝对路径
6)从宿主机拷贝文件到容器内: docker cp 宿主机绝对路径 容器ID:容器内绝对路径
7)提交容器副本使之成为一个新的镜像:
docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[标签名/版本号]
8)Dockerfile文件的概念和基础介绍:
Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
特点:
1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
2)指令按照从上到下,顺序执行。
3)#表示注释
4)每条指令都会创建一个新的镜像层,并对镜像进行提交。
Dockfile文件的保留字概念:(关键主要的介绍-也几乎全部了)
FROM #基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER #镜像维护者信息(姓名和邮箱地址)
RUN #容器构建时需要运行的命令
EXPOSE #当前容器对外暴露出的端口
WORKDIR #指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV #用来在构建镜像过程中设置环境变量
ADD #将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包(拷贝加解压缩)
COPY #类似ADD,拷贝文件和目录到镜像中(仅拷贝)
VOLUME #容器数据卷,用于数据保存和持久化工作
CMD #指定一个容器启动时要运行的命令,dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT #指定一个容器启动时要运行的命令,目的和CMD一样,都是在指定容器启动程序及参数(追加)
ONBUILD #当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
Dockerfile文件映射容器卷和宿主机目录映射:
上面等同于下面:
附加:
9)使用dockerfile文件构建镜像时候使用方法:
# docker build -f /root/Dockerfile2 -t mycentos:v1 . #-f指定dockerfile文件名
注意:上述的,如果dockerfile名字是:Dockerfile也可省略指定配置文件名,直接用: docker build -t mycentos:v2 .
10)Dockerfile文件中ENTRYPOINT和CMD解析:
1)ENTRYPOINT
#cat Dockerfile
.......
ENTRYPOINT ["curl","-s","http://ip.cn"] #下面最后run容器最后添加-i后相当于:ENTRYPOINT ["curl","-s","-i","http://ip.cn"]
# docker run -it Dockerfile文件形成的镜像:标签号 -i #能执行,不报错
2)CMD
#cat Dockerfile
.......
CMD ["curl","-s","http://ip.cn"] #下面最后run容器最后添加-i后相当于在改行下面添加了一行:CMD ["-i"],则改行被覆盖,只执行添加的,会报错
# docker run -it Dockerfile文件形成的镜像:标签号 -i #会报错
#注意:上面都包括有:(如果出现如下报错,解决方法如下:)
报错: [Warning] IPv4 forwarding is disabled. Networking will not work.
解决:# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #添加
重启network服务: systemctl restart network
如果对运维课程感兴趣,可以在b站上搜索我的账号: 运维实战课程,可以关注我,学习更多运维实战技术视频!