不错的参考文章:
注释:
docker:是一个平台 镜像:如静态的程序文件(镜像是只读的,不能进行修改除非重新构建镜像)容器:如程序在运行时的进程 注释事项:运行在容器中的进程或任务不要放入容器的后台,否则将无法使用;
1、安装docker
#安装新版本的dockercd /etc/yum.repos.d/wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
#配置加速器1、打开阿里镜像仓库:https://dev.aliyun.com/2、点击管理中心3、容器镜像服务--->镜像加速器(里边包含操作步骤)sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://bsskgox8.mirror.aliyuncs.com"]}EOF sudo systemctl daemon-reloadsudo systemctl restart docker systemctl status docker.service
2、docker的基本使用
2.0、查看docker版本或更详细信息
docker version #版本号docker info 非常详细的信息
2.1、基础命令
******系统内当前有的镜像******旧:docker images 新:docker image ls [root@docker ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest af2f74c517aa 2 weeks ago 1.2MB nginx 1.14.2 295c7be07902 3 weeks ago 109MB 镜像名称 标签 镜像唯一ID值 什么时候创建的 大小
******如果本地有镜像可以导入******将下载先来的centos.tar压缩的镜像上传到系统内docker load --input centos.tar再次使用docker images******查看并下载远端docker的镜像(未来生产中绝大部分都是自己封装的镜像)******docker search nginx -s 100 #查看大于100M的镜像,不加-s也是可以的,排在第一位的是官方的 https://hub.docker.com/ 也可以这样
#从公有docker获取镜像(新旧命令结果一样,只是docker对命令进行了分级) (如果后边不跟版本号,默认就是nginx的最新版,即lastet版)旧命令:docker pull nginx:1.14.2 新命令:docker image pull nginx:1.14.2******打包当前的一个镜像******docker save -o centos.tar centos注释:cetnos.tar 是要打包的名字 centos的当前系统中已有的一个镜像 ******删除一个镜像****** 旧命令:docker rmi 镜像name 新命令docker image rm 镜像name ******logs 查看docker的访问日志****** #如果没有给容器起名字就使用ID查看 docker logs f4162b65e4f4 ************查看后台运行的容器****************
#查看后台正在运行的程序
[root@docker ~]# docker ps (查看在运行的容器)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES容器的ID 基于那个镜像运行的程序 在容器中运行的命令 容器创建时间 状态 映射的端口 容器的名字
#查看后台已经创建的容器(已经停止的容器)(容器在停止运行后默认不会删除) #docker ps -a #后台运行一个镜像 docker run -d --name web3 nginx:1.14.2
************删除容器************#删除一个容器docker rm 5182e96772bf(镜像的ID)注释:如果这个镜像正在使用不会被删除 #如何删除一个正在运行的容器 docker rm -f db01
#强制删除多个容器db01、db02
docker rm -f db01 db02#删除容器nginx01,并删除容器挂载的数据卷docker rm -v nginx01
#容器运行完毕后就会被删除
docker run --rm centos /bin/echo "hehe"
******************一次性关闭、删除所有容器*********************
docker kill $(docker ps -aq)
docker rm $(docker ps -aq)
*****在后台运行一个nginx容器*****
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest af2f74c517aa 2 weeks ago 1.2MBnginx 1.14.2 295c7be07902 3 weeks ago 109MB[root@docker ~]#docker run --name web1 -d nginx:1.14.2
2.2、操作实例
2.2.1、Hello word
不进入容器只是通过容器运行一个命令
第一种运行完命令后容器就关闭了!!!
第二种运行完命令后容器不关闭,正常运行着;第二种命令还可以进入容器内,退出后容器仍不关闭!!!!(推荐使用,但不是进入系统的最佳实践)
[root@docker ~]# docker run centos /bin/echo 'Hello world'Hello world
[root@docker ~]# docker pull redis:4-alpine
[root@docker ~]# docker run -name redis3 -d redis:4-alpine
[root@docker ~]# docker exec -it redis3 /bin/sh
/data # psPID USER TIME COMMAND 1 redis 0:00 redis-server 12 root 0:00 /bin/sh 17 root 0:00 ps/data # netstat -luntp
注释:使用centos镜像输出一个Hello world 后,centos镜像就会关闭
2.2.2、查看当前docker实例
[root@docker ~]# docker ps -a #查看所有docker实例(启动和关闭的)CONTAINER ID IMAGE(镜像的名称) COMMAND(运行的命令) CREATED(创建了多长时间) STATUS(启动状态) PORTS NAMES(名称,不指定就随机取个)76782f990cd5 centos "/bin/echo 'Hello ..." 4 minutes ago Exited (0) 4 minutes ago stoic_turing[root@docker ~]# docker ps #不加-a只显示运行中的CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
注释:以后我们管理docker镜像就需要依靠ID和最后的那个名称
2.2.3、实际使用的命令
[root@docker ~]# docker run --name mydocker -t -i centos /bin/bash[root@38a56310555e /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.1 0.1 11820 1908 ? Ss 10:20 0:00 /bin/bashroot 13 0.0 0.0 51708 1708 ? R+ 10:20 0:00 ps aux 注释:run 运行一个镜像 --name 给容器起个名称 -t 打开一个运行终端 -i 标准输出内容 centos 使用哪个镜像运行的容器 /bin/bash 要运行的命令
注释:容器不是虚拟机,只是运行在系统中的一个进程; 等你退出容器时,这个容器也关闭了
2.2.4、一个不安全的命令(不推荐使用)
#两个容器都是关闭的 [root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES38a56310555e centos "/bin/bash" 13 minutes ago Exited (0) 30 seconds ago mydocker76782f990cd5 centos "/bin/echo 'Hello ..." 25 minutes ago Exited (0) 25 minutes ago stoic_turing #开启一个容器 [root@docker ~]# docker start mydockermydocker #进入这个容器中后再退出
[root@docker ~]# docker attach mydocker
[root@38a56310555e /]# exit exit注释:你退出后使用docker ps 查看时mydocker已经关闭了。。。。。。
2.2.5、一个安全的命令(推荐使用)
yum -y install util-linux#启动mydocker后再查看mydocker的PID值[root@docker ~]# docker inspect -f "{ { .State.Pid }}" mydocker14409 #指定PID进入容器系统 [root@docker ~]# nsenter -t 14409 -m -u -i -n -p[root@38a56310555e /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 10:48 ? 00:00:00 /bin/bashroot 13 0 0 10:50 ? 00:00:00 -bash #这是多起了一个bash进程,退出就会结束这个进程root 29 13 0 10:52 ? 00:00:00 ps -ef[root@38a56310555e /]# exitlogout #查看当前运行的容器,发现mydocker容器并没有因为登出而关闭[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES38a56310555e centos "/bin/bash" 32 minutes ago Up 3 minutes mydocker[root@docker ~]# #这是一个脚本
[root@docker ~]# cat docker_in.sh
#!/bin/bashdocker_in(){ docker_in=$1 PID=$(docker inspect -f "{ { .State.Pid }}" $docker_in) nsenter -t $PID -m -u -i -n -p}docker_in $1
[root@docker ~]# chmod +x docker_in.sh
#最佳登陆实践
[root@docker ~]# ./docker_in.sh mydocker(可以传递名称ID)[root@38a56310555e /]#2.3、容器的后台运行
#到公有docker库内查看是否有nginx镜像docker search nginx -s 100#下载nginx镜像docker pull nginx#后台运行nginx镜像docker run -d nginx
3、网络设置
3.1、随机映射端口
[root@docker ~]# docker run -d --name mynginx -P nginx9f943ee2df6768494bdd2cfd7d26c928b3fa652822b4ce7906a465e94ea55707[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9f943ee2df67 nginx "nginx -g 'daemon ..." 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp mynginx
注释:此时就可以通过外网即:10.10.10.60:3276访问到docker的80端口了。
3.2、指点映射端口(使用最多的三种端口映射的方式)
#指定IP地址和端口映射80 [root@docker ~]# docker run --name nginx-v01 -p 10.10.10.60:81:80 -d nginx[root@docker ~]# docker port nginx-v0180/tcp -> 10.10.10.60:81 注释:nginx-v01的80端口映射到了宿主机60的81端口上了 #不指定IP地址,默认是0.0.0.0 进行端口映射
[root@docker ~]# docker run -d -p 443:443 -p 88:80 --name nginx_v02 nginx
e57d449cc7c462781a27979ed048052e41e4fe7f559c536fb817d11ee4e8f71e[root@docker ~]# docker port nginx_v02443/tcp -> 0.0.0.0:44380/tcp -> 0.0.0.0:88
#指定ip进行多端口映射
[root@docker ~]# docker run -d -p 10.10.10.60:5543:5543 -p 10.10.10.60:89:80 --name nginx_v03 nginx1dd79b9e693c7463347a6ed28319376bdf1f4dd7d51df318bd19f52382245d12[root@docker ~]# docker port nginx_v035543/tcp -> 10.10.10.60:554380/tcp -> 10.10.10.60:89
4、docker数据管理
一共提供两种:数据卷和数据卷容器
4.1、数据卷(随机挂载到宿主机目录)
# -v /data 在docker内挂载一个/data/数据目录docker run --name nginx_v04 -d -v /data nginx#进入nginx_v04容器sh docker_in.sh nginx_v04root@6ad71a3c2752:/# cd /data/root@6ad71a3c2752:/data# ls啥也没有#在宿主机上查看这个/data目录挂载在本地哪个位置[root@docker ~]# docker inspect -f { {.Mounts}} nginx_v04[{volume e436629bf1173b7b20dd5c8d91a17f7de28ee98185c5a8687d50a3353cc1f601 /var/lib/docker/volumes/e436629bf1173b7b20dd5c8d91a17f7de28ee98185c5a8687d50a3353cc1f601/_data /data local true }][root@docker ~]# cd /var/lib/docker/volumes/e436629bf1173b7b20dd5c8d91a17f7de28ee98185c5a8687d50a3353cc1f601/_data[root@docker _data]# touch 001.txt#再到nginx_v04内查看是否有这个文件root@6ad71a3c2752:/data# ls 001.txt
4.1、数据卷(指定挂载到宿主机的目录)
[root@docker ~]# mkdir /data/docker-vloume-nginx -p[root@docker ~]# docker run --name nginx_v01 -d -v /data/docker-vloume-nginx/:/data nginxa85fe83c5e7ec14b04451a48c99eb17e53054e0f24be9c6f88250d3cfac12b7c #以只读的方式进行挂载,docker下的date只读
docker run --name nginx_v01 -d -v /data/docker-vloume-nginx/:/data.ro nginx
注释:文件也可以被挂载
4.2、数据卷容器
简单理解就是该功能类似建立了一个NFS共享存储空间,其他docker容器可以全部挂载到这一个数据卷容器内。
在多个docker之间需要用到数据共享的情况下是非常有用的
docker run -it --name nginx_v02 --volumes-from nginx_v01 centos /bin/bash
注释:nginx_v01是挂载的nginx的容器,即使nginx_v01这个容器关闭了也不影响centos对数据卷的访问;但问题是nginx_v01就删除不掉了,除非解除数据卷的关联。
5、docker镜像的构建
阿里yum源:https://opsx.alibaba.com/mirror
5.1、手动构建镜像
#使用centos镜像创建一个名称为:mynginx的容器,并进入该容器内docker run --name mynginx -it centos#安装nginx程序;生产中可以编译安装,本次yum安装wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum -y install nginxvi /etc/nginx/nginx.conf daemon off; #添加这一行内容,保存退出exit注释:因为本次的实验目的是构建镜像,就不启动nginx了#查看mynginx容器的ID号[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf02087053ac1 centos "/bin/bash" 8 minutes ago Exited (0) 11 seconds ago mynginx#提交容器到本地变为镜像 本地提交的一个备注 容器的ID 本地库名/镜像的名字(可以重新起名称)[root@docker ~]# docker commit -m "My nginx" f02087053ac1 yanqi/mynginx_v01sha256:aa18574722af10422abd96205f94391452d701ccfa7d5d5f3081935258f67458#查看本地已有的镜像[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEyanqi/mynginx_v01 latest aa18574722af 7 seconds ago 408 MBdocker.io/nginx latest 71c43202b8ac 15 hours ago 109 MBdocker.io/centos latest 5182e96772bf 3 weeks ago 200 MB#使用mynginx_v01镜像运行一个名为nginx001的容器 端口映射 镜像地址 命令(此处的nginx的命令,启动容器中nginx的命令)[root@docker ~]# docker run --name nginx001 -d -p 88:80 yanqi/mynginx_v01 nginx99e2f25f32e618124624f122d7dd0e3696b98eec7dd4d63aecf87a509bb13c6a
验证:
5.2、自动构建镜像
#创建一个目录mkdir -p /opt/dockerfile/nginxcd /opt/dockerfile/nginx*************************************************************#创建一个名为:Dockerfile的文件(必须为这个名称)[root@docker nginx]# cat Dockerfile #This Dockerfile nginx#指定使用哪个基础镜像,如果没有就会到公有docker库内pull一个FROM centos#谁创建的MAINTAINER Yanqi.Huang @qq.com#Commands(步骤)RUN yum -y install wgetRUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoRUN yum -y install nginx && yum clean allRUN echo "daemon off;" >> /etc/nginx/nginx.conf#index.html文件必须再当前目录下,才会被加载ADD index.html /usr/share/nginx/html/index.html#写明使用对外使用哪个端口EXPOSE 80#对于这个镜像运行什么命令CMD ["nginx"]***************************************************************[root@docker nginx]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx_kuaiyun latest 4b54aabbddac 10 minutes ago 365 MByanqi/mynginx_v01 latest aa18574722af About an hour ago 408 MBdocker.io/nginx latest 71c43202b8ac 17 hours ago 109 MBdocker.io/centos latest 5182e96772bf 3 weeks ago 200 MB#创建一个名为mynginx_v50的容器 端口映射 使用哪个镜像[root@docker nginx]# docker run --name mynginx_v50 -d -p 82:80 nginx_kuaiyun511c37eec11e902660749d1f39154b63acf47eb26dbf4b79533f65381c957d63[root@docker nginx]#
测试结果:
6、应用实践
分层:系统层、运行环境层、应用服务层
6.1、系统基础层(安装基础命令)
因为都是最小化安装的系统,所以需要安装必要的命令;以后再部署业务环境的话可以直接使用这个镜像即可!!!
[root@docker cetnos-7]# pwd/root/docker/system/cetnos-7wget http://mirrors.aliyun.com/repo/epel-7.repo************************************************************[root@docker cetnos-7]# cat Dockerfile # Docker for CetnOSFROM centosMAINTAINER Yanqi.Hang#Commands(步骤)RUN yum -y install wgetRUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoRUN yum -y install nginx && yum clean allRUN yum -y install vim net-tools git lrzsz && yum clean all****************************************************************#yanqi/centos-7:v1是新启的名字 v1为标签[root@docker cetnos-7]#docker build -t yanqi/centos-7:v1 .[root@docker cetnos-7]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEyanqi/centos-7 v1 86ab642ce7ce 5 minutes ago 423 MBdocker.io/centos latest 5182e96772bf 3 weeks ago 200 MB
6.2、安装一个可以ssh的容器
[root@docker cetnos-7]# cat Dockerfile # Docker for CetnOSFROM centosMAINTAINER Yanqi.Hang#Commands(步骤)RUN yum -y install wgetRUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoRUN yum -y install vim net-tools git lrzsz tree openssh-clients openssl-devel openssh-server && yum clean allRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_keyRUN echo "root:yanqi" | chpasswd [root@docker cetnos-7]# docker build -t yanqi/centos.ssh:v1 .
6.3、安装一个python容器带ssh功能
[root@docker python]# pwd/root/docker/runtime/python[root@docker python]# cat Dockerfile FROM yanqi/centos.ssh:v1MAINTAINER Yanqi.Huang @qq.comRUN yum install -y python-devel python-pip supervisorRUN pip install --upgrade pip[root@docker python]# docker build -t yanqi/python-ssh:v1 .
6.4、例如创建一个web网站镜像
#例如www01.api就是第一个网址[root@docker www01.api]# pwd/root/docker/app/www01.api#网站文件[root@docker www01.api]# cat app.py from flask import Flaskapp = Flask(__name__)@app.route('/')def hello(): return 'Hello World!'if __name__ == "__main__": app.run(host="0.0.0.0",debug=True)[root@docker www01.api]# ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥#本地测试yum -y install python-pippip install flaskpython app.py#此时本地会开启开启一个5000端口#URL:http://10.10.10.60:5000/ 会看到一个Hello World ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥#这是要安装的软件写在这里[root@docker www01.api]# cat requirements.txt flask#这是Dockfile文件内容[root@docker www01.api]# cat Dockerfile #Base imagesFROM yanqi/python-ssh:v1#MaintainerMAINTAINER Yanqi.Huang @qq.com#add user wwwRUN useradd -s /sbin/nologin -M www#ADD fileADD app.py /opt/app.pyADD requirements.txt /opt/ADD supervisord.conf /etc/supervisord.confADD app-supervisor.ini /etc/supervisord.d/#pipRUN /usr/bin/yum install python-pipRUN /usr/bin/pip2.7 install -r /opt/requirements.txt#PortEXPOSE 22 5000#CMDCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]注释:supervisord这个进程管理软件在python-ssh:v1的镜像内已经安装过了。#这是supervisord需要读的启动进程的文件[root@docker www01.api]# cat app-supervisor.ini [program:www01-api]command=/usr/bin/python2.7 /opt/app.pyprocess_name=%(program_name)sautostart=trueuser=wwwstdout_logfile=/opt/app.logstderr_logfile=/opt/app.error[program:sshd]command=/usr/sbin/sshd -Dprocess_name=%(program_name)sautostart=true
6.4.1、开始构建镜像
docker build -t yanqi/python-www01.api .[root@docker www01.api]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEyanqi/python-www01.api v1 4d2135d26efc 19 hours ago 706 MByanqi/python-ssh v1 a81c1440935e 22 hours ago 573 MByanqi/centos.ssh v1 33ce3f0275b3 22 hours ago 393 MB
6.4.2、把这个镜像使用容器运行起来
给容器起个名字 映射端口 -d后台运行 使用哪个镜像
docker run --name www01.api -p 80:5000 -p 8022:22 -d yanqi/python-www01.api:v1
6.4.3、测试结果
7、库
FAQ:
1、常用命令截图