美文网首页
2018-01-13Docker入门学习之一

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

作者: 什锦小沐 | 来源:发表于2018-01-14 19:53 被阅读0次

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常用命令

相关文章

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

    1.Linux安装Docker sudo wget -qO- https//get.docker.com | sh...

  • Angular学习之一(入门)

    开发环境安装 1 安装node.js 下载安装地址下载后点击安装就可以了,点下一步即可,注意配置npm的环境变量;...

  • 机器学习的入门“秘籍”

    摘要:机器学习已经成为当下最火热的技术之一,对于初学者来说,如何快速入门机器学习是至关重要的。本文属于入门级宝典,...

  • gradle

    Gradle学习系列之一——Gradle快速入门 - 无知者云 - 博客园 Gradle学习总结——根本上看透An...

  • 爬虫手册(二):urllib和requests

    (一)urllib python爬虫的基础框架之一,也是内置库之一的urllib,是我入门时学习的爬虫方法。在py...

  • 策略PM入门学习索引

    策略PM入门学习(一)策略PM入门学习(二)策略PM入门学习(三)策略PM入门学习(四)策略PM入门学习(五)策略...

  • 商业PM入门学习索引

    商业PM入门学习(一)商业PM入门学习(二)商业PM入门学习(三)商业PM入门学习延伸阅读(1)商业PM入门学习(...

  • Redux入门学习系列教程(二)

    Redux入门学习系列教程(一)Redux入门学习系列教程(二)Redux入门学习系列教程(三)Redux入门学习...

  • Redux入门学习系列教程(四)

    Redux入门学习系列教程(一)Redux入门学习系列教程(二)Redux入门学习系列教程(三)Redux入门学习...

  • Redux入门学习系列教程(一)

    Redux入门学习系列教程(一)Redux入门学习系列教程(二)Redux入门学习系列教程(三)Redux入门学习...

网友评论

      本文标题:2018-01-13Docker入门学习之一

      本文链接:https://www.haomeiwen.com/subject/iamcoxtx.html