2018-01-13Docker入门学习之一

1.Linux安装Docker

sudo wget -qO- https//get.docker.com | sh

    sudo:作为普通用户,希望以管理员的身份运行

    wget:Linux的下载工具,如果没有下载即可

    -q:让wget输出不要太多

    O-:让wget标准输出,而不是输出到文件

    https//get.docker.com:下载地址

    | sh:管道的概念,从上面的网址下载了一个shell脚本,交给sh[shell]去执行

        shell会检测你的版本,并按照你的版本来安装

sudo usermod -aG docker root

    docker 只允许root执行,将当前用户加入到docker组中


    如果系统是CentOS7,则CentOS-Extras 库中已带 Docker,可以直接安装:

yum -y install docker

    启动,和其他的service启动都是一样的

systemctl start docker

    让docker开机启动

chkconfig docker on

    查看docker的相关信息

docker info

2.Docker的架构Architectrue


Docker架构示意图之一

    DOCKER_HOST:进行Docker操作的虚拟机;

    Docker daemon:由虚拟机运行的Docker程序,由该程序运行各种各样的Docker操作,如:下载Docker的镜像;运行一个容器;

    Client:客户端,我们从客户端给Docker daemon发起命令,进行操作,如:docker build;docker pull;docker run;

    Registry:互联网的一个仓库服务,所有Docker用户共享的一个Docker服务,Docker daemon可以从其中获取文件


Docker架构示意图之二

3.Docker的简单命令及解释

Docker简单命令之一
Docker简单命令之二

    3.1运行Docker镜像

    docker run ubuntu echo hello world

    通过Docker运行ubuntu image,结束后,输出hello world;

    如果本地的没有,会从远端的镜像仓库下载,

    查看本地images镜像

docker images

    带有参数的docker run

docker run -p 8080:80 -d daocloud.io/nginx

    -p : 做端口映射,8080:80,将原本的Docker的80端口,映射到本地的8080端口

    -d : 允许程序直接返回,以守护进程的方式运行的,并且会返回CONTAINER ID

    查看当前运行的Docker程序,刚才运行了nginx服务后,可以用curl localhost:8080,进行确认

    3.2查看Docker容器

docker ps 

    如果没有任何参数,只会显示当前运行的容器

    列出所有的docker容器:docker ps -a

    3.3将文件copy进容器的文件夹内

docker cp index.html 3c160b38650f://usr/share/nginx/html

    其中3c160b38650f为其CONTAINER ID

    3.4停止Docker容器

docker stop 3c160b38650f

    docker stop只是将容器停止了,并没有删除。再次执行docker run命令会创建一个新的容器。

    Docker在容器内的操作都是没有保存的,

    3.5提交当前运行的容器的改动

docker commit -m 'fun' 41835fe93f71 nginx-docker

    此命令会产生一个新的容器,可以在docker images中查看,后面的'nginx-docker'是其名字

    3.6删除Docker镜像

docker rmi 300f719c1d79

    3.7删除Docker容器

docker rm 3c160b38650f 53ab421c10c9

    可以使用空格分开,删除多个

4.Dockerfile

   4.1编写Dockerfile文档

    FROM alpine:latest

    MAINTAINER YuSongYuan

    CMD echo "hello docker !!!"

    alpine : 是为了docker做的一个极小的linux环境,产生的image会非常小

    MAINTAINER : 是告诉其他人这个镜像是谁制作的

    CMD : 运行一个cmd命令

    4.2使用docker build命令构建镜像

docker build -t hello_docker .

    -t : 为新建的镜像添加一个标签/名字,标签/名字为hello_docker

    . : 这个点,指的是路径,将当前的路径下的所有的文件都给docker engine,让其来产生镜像

    运行之后就会在docker images中产生我们的刚刚创建的镜像,并且标签/名字为hello_docker,可以运行刚刚产生的镜像,会执行CMD后面的命令,输出hello docker !!!

    ps:在build时,每一个命令[FROM ,COPY ... ]都会产生一个新层,这些层都是只读的,当被运行成为容器后,变为一个整体,容器层,该层是可读可写的

    4.3进阶Dockerfile

    在新的目录Dockerfile02,编写Dockerfile文档

FROM daocloud.io/nginx

MAINTAINER YuSongYuan

COPY index.html /usr/share/nginx/html

ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

EXPOSE 80

    FROM ubuntu : 给出基础镜像的名字

    RUN apt-get update : 使用apt-get更新ubuntu的库

    RUN apt-get install -y nginx : 使用apt-get安装nginx,并且不提醒

    COPY index.html /var/www/html : 将index.html文件拷贝进该文件夹内

    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] : 提供容器的入点,会将三个内容展开,用空格隔开,执行;这个参数的意义是,将nginx在前台执行,而不是作为守护进程来执行

    EXPOSE 80 : 暴露一个端口,普通的http监听的端口

    ps:apt-get是一个和yum类似的下载安装包的插件,如果没有改插件,build时会报错

    这时候使用

docker build -t hello_nginx .

docker run -d -p 80:80 hello_nginx

    运行后,index.html已经被拷贝到Dockerfile中的指向的路径,可以直接用curl localhost:80,进行访问,出现的就是index.html中的内容

4.4Dockerfile语法

Dockerfile语法之一
Dockerfile语法之二

5.Docker的存储技术Volume

    提供独立于容器之外的持久化存储

    可以提供容器与容器之间共享的数据

    5.1Volume操作

docker run -d --name nginx -v /usr/share/nginx/html hello_nginx

     --name nginx : 给当前容器一个名字 nginx

    -v /usr/share/nginx/html : 容器内部的一个地址,用来访问这些网页的一个地址???

docker inspect nginx

    inspect nginx : 检查名字为 nginx的容器

    其中

"Mounts": [

            {

                "Name": "79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15",

                "Source": "/var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data",

                "Destination": "/usr/share/nginx/html",

                "Driver": "local",

                "Mode": "",

                "RW": true,

                "Propagation": ""

            }

        ],

    将宿主Source中的路径,挂载到了Destination中

    如果是linux_host,可以直接访问Source中的路径

ll /var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data

    如果在Mac中,Source的路径,外面还有一层虚拟层,直接访问是无法访问的

    可以使用

screen ~/Library/Containers/com.docker.docker/Data/com.docker.docker.amd64-linux/tty

    这个本人并未验证

    进入容器中

docker exec -it nginx /bin/bash

    比如:查看我们添加进入的index.html,首先cd /usr/share/nginx/html/,然后应当使用cat index.html,使用vi或vim都是找到不到命令的

    5.2挂载系统路径

docker run -p 80:80 -d -v $PWD/html : /usr/share/nginx/html daocloud.io/nginx

    运行daocloud.io/nginx镜像,并将当前目录[$PWD]下的html目录挂载到/usr/share/nginx/html 中

    这时,当我们修改html中的index.html时,访问localhost:8080的内容也会随之改变

    5.3挂载容器

docker creat -v $PWD/data:/var/mydata --name data_container  docker.io/alpine

    以alpine为基础镜像,创建一个数据镜像,并将当前目录中的data挂载到/var/mydata中,起名为data_container

docker run -it --volumes-from data_container docker.io/ubuntu /bin/bash

    -it : 这里因为docker.io/alpine是一个基础镜像,没有什么服务,所以用 -it : 以交互的方式运行,需要后面加上/bin/bash

    --volumes-from : 从另外一个容器中挂载

    这里运行后,会直接进入到容器中,输入下面的命令,这个命令也就是上面使用inspecte命令中,看到的其中的一个属性

mount

    会在其中看到

/dev/mapper/centos-root on /var/mydata type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

    这时候我们可以cd  /var/mydata中,并touch ysy.txt, exit退出容器后,流量可以在data文件夹中看到ysy.txt

    这时说明,我们的容器挂载是成功的,一个容器可以被多个容器挂载,做到数据一致性

6.Resgitry镜像仓库

    6.1术语介绍

Docker相关术语介绍

    6.2命令介绍

Docker的Registry命令

    6.3Registry练习

    从远程仓库中搜索whalesay

docker search whalesay

    其中STAR表示获取的星星的数量,OFFICIA是标注是否为官方的

    从远程仓库下载whalesay镜像

docker pull docker.io/docker/whalesay

    下载完成后,可以用docker images命令看到本地的镜像仓库中,已经存在刚刚下载的镜像,

    REPOSITORY                      TAG          IMAGE ID              CREATED           SIZE

    docker.io/docker/whalesay    latest         6b362a9f73eb      2 years ago         247 MB

    REPOSITORY : 镜像的名字

     TAG : 镜像的标签,latest为缺省的标签,当没有设置标签时,这个就是其标签

    在本地新建一个镜像,以ysy/whalesay为其名字

    docker tag docker.io/docker/whalesay ysy/whalesay

    这时用docker images命令可以看到本地仓库中已经多了名字为ysy/whalesay 的镜像

7.docker-compose多容器app

    docker-compose是一个独立的,用于通过文本文件拉起多容器app

    7.1下载docker-compose

    在linux中下载docker-compose

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose

    其中,-$(uname -s)-$(uname -m)是获取当前的这两个命令的输出,拼接到地址中,> 是指通过管道技术,下载到后面的目录中,成为可执行文件

[root@localhost ~]# uname -s

Linux

[root@localhost ~]# uname -m

x86_64

    7.2docker-compose实战

        7.2.1实战项目架构介绍

docker-compose实战项目结构示意图

        7.2.2实战项目yaml配置文件

docker-compose实战项目yaml配置文件

        7.2.3项目实战

            在ghost中创建三个文件夹

   mkdir ghost nginx data

            在ghost文件夹中创建Dockerfile文件

FROM ghost

COPY ./config.js /var/lib/ghost/config.js

EXPOSE 2368

CMD ["npm", "start", "--production"]

            ghost : 从官方拉取

            ["npm", "start", "--production"] : 这个是node.js的程序,使用npm命令启动

            在ghost文件夹中创建config.js文件

var path = require('path'),

config;


config = {

        production:{

                url: 'http://mytestblog.com',

                mail: {},

                database: {

                        client: 'mysql',

                        connection: {

                                host: 'db',

                                user: 'ghost',

                                password: 'ghost',

                                database: 'ghost',

                                port: '3306',

                                charst: 'utf8'

                        },

                        debug: false

                },

                paths: {

                        contentPath: path.join(process.env.GHOST_CONTENT, '/')

                },

                server: {

                        host: '0.0.0.0',

                        prot: '2368'

                }

        }

};

                在nginx中添加Dockerfile配置文件

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

                因为在ghost中已经有启动命令,所以这里就不在有启动命令

                在nginx文件夹中添加nginx.conf文件

worker processes 4;

events {worker connections 1024;}

http {

        server {

                listen 80;

                lacation / {

                        proxy pass http://ghost-app:2368;

                }

        }

}

                这里是使用ghost-app这个名字指向ghost

                在最外层的ghost文件夹内创建docker-compose.yml文件

version: '2'

networks:

        ghost:

service:

        ghost-app:

                build: ghost

                network:

                        - ghost

                depends_on:

                        - db

                ports:

                        - "2368:2368"

        nginx:

                build: nginx

                networks:

                        - ghost

                depends_on:

                        - ghost-app

                ports:

                        - "80:80"

        db:

                image: "mysql:5.7.15"

                networks:

                        - ghost

                environment:

                        MYSQL_ROOT_PASSWORD: mysqlroot

                        MYSQL_USER: ghost

                        MYSQL_PASSWORD: ghost

                volumes:

                        - $PWD/data:/var/lib/mysql

                ports:

                        - “3306”

                 volumes : 将数据库的路径挂载到容器中,这样写的博客就会被存下来,不会随着容器的消失而消失

                将docker-compose拉起来

docker-compose up -d

                这时候访问 localhost:80,产生502错误,说明nginx已经起来的,但是nginx和ghost之间链接有错误

                将nginx.conf的变量名中的空格替换为下划线

                将docker-compose停掉

docker-compose stop

                将停掉的容器删除

docker-compose rm

                再次将docker-compose拉起来的时候,需要使用build命令

docker-compose build

                因为第一次将docker-compose拉起来的时候,docker-compose会自动帮我们build镜像,但是第二次就不会了

                然后再次使用 docker-compose up -d 命令将docker-compose拉起来

                访问locallhost:80就可以正常的看到nginx的欢迎页面

                这时访问localhost/ghost路径,就可以自动的跳转到localhost/ghost/setup的路径下面

                这时表示我们的三个容器协作运行已经是没问题的了

                本人的docker-compose没有下载完成,暂未测试

        7.2.4docker-compose常用命令

docker-compose.yml常用参数
docker-compose常用命令
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,505评论 15 147
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,468评论 0 120
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,128评论 0 13
  • 0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...
    sessionboy阅读 3,836评论 2 49
  • 前好些时候终于想明白了自己,走出了这段漫长的迷茫期,欣慰。 也在努力的去丰富自己的人生,老了也可以当故事说给我的子...
    VickyJ阅读 1,430评论 0 0