博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker基础
阅读量:5997 次
发布时间:2019-06-20

本文共 15451 字,大约阅读时间需要 51 分钟。

不错的参考文章:

 

注释:

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 SIZE
busybox latest af2f74c517aa 2 weeks ago 1.2MB
nginx 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 # ps
PID 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/bash
docker_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_v02
443/tcp -> 0.0.0.0:443
80/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 nginx
1dd79b9e693c7463347a6ed28319376bdf1f4dd7d51df318bd19f52382245d12
[root@docker ~]# docker port nginx_v03
5543/tcp -> 10.10.10.60:5543
80/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、常用命令截图

 

转载于:https://www.cnblogs.com/huangyanqi/p/9555640.html

你可能感兴趣的文章
将某字符串切割成阵列并排序列出
查看>>
Godaady域名+花生壳 实现动态解析
查看>>
前端代码标准最佳实践:javascript篇
查看>>
__bridge,__bridge_transfer和__bridge_retained的使用和区别【转载】
查看>>
Swift游戏实战-跑酷熊猫 10 视差滚动背景
查看>>
Java获取时间与系统时间相差8小时终极解决方案
查看>>
WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
查看>>
mysql一个事务中有DDL语句的binlog情况
查看>>
spring remoting源码分析--Hessian分析
查看>>
视频理论基础
查看>>
WordPress插件--WP BaiDu Submit结构化数据插件又快又全的向百度提交网页
查看>>
【C语言入门教程】4.5 指针变量的定义与引用
查看>>
Java中集合Set的用法
查看>>
Oracle 树操作(select…start with…connect by…prior)
查看>>
malloc 函数工作机制(转)
查看>>
phpMyAdmim和Yii 连接Mysql报错。
查看>>
Ubuntu 16.04关闭Alt+鼠标左键移动窗口(转)
查看>>
【hihocoder 1627】Domains(字典树)
查看>>
使用JMeter创建数据库(Mysql)测试
查看>>
013PHP基础知识——流程控制(一)
查看>>