Docker基础入门

本文目录:

  • 1.Doker是什么
  • 2.Docker的特点
  • 3.初次安装和使用
  • 4.安装一个nginx
  • 5.安装一个mysql
  • 6.DockerFile定制镜像
  • 7.定制NodeJS镜像
  • 8.定制PM2
  • 9.初识docker-compose
  • 10.初识docker Hub

1.Doker是什么

  • Build,Ship and Run Any App,AnyWhere ——一次封装,到处执行。
  • 基于Linux的高效、敏捷、轻量级的容器(轻量虚拟)方案

2.Docker的特点

  • 高效的利用系统资源
  • 快速的启动时间
  • 一致的运行环境
  • 持续交付和部署

Docker对比传统虚拟机:

特性 Docker 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

3.初次安装和使用

首先我们需要有一台Linux的云服务器,然后远程连接上这台服务器。
连接之后,输入以下的指令进行配置:

  • sudo apt-get update
    (apt升级)
  • sudo apt-get install
    apt-transport-https
    ca-certificates
    curl
    software-properties-common
    (添加相关软件包)
  • curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    (下载软件包的合法性,需要添加软件源的 GPG 密钥)
  • sudo add-apt-repository
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu
    $(lsb_release -cs)
    stable"
    (source.list 中添加 Docker 软件源)
  • sudo apt-get update
    sudo apt-get install docker-ce
    (安装 Docker CE,这一步需要有个确定环节,输入y继续完成安装)
  • sudo systemctl enable docker
    sudo systemctl start docker
    (启动 Docker CE,回车确定启动)
  • docker run hello-world
    (Helloworld测试)

上面初始化服务器是用的apt-get,我们也可以使用yum,它们本质上没什么区别。
①.先删除旧的版本(如果没有可以跳过)

$ sudo yum remove docker \
                                 docker-client \
                                 docker-client-latest \
                                 docker-common \
                                 docker-latest \
                                 docker-latest-logrotate \
                                 docker-logrotate \
                                 docker-engine

②.安装必须的依赖

$ sudo yum install -y yum-utils \
   device-mapper-persistent-data \
   lvm2

添加stable的Docker-ce的源:

$ sudo yum-congfig-manager \
   --add-repo \
   https://download.docker.com/linux/centos/docker-ce/repo

③ .安装docker-ce

$ sudo yum install docker-ce docker-ce-cli containerd.io

④.测试启动docker进程 systemctl start docker,正常情况执行这个指令后没有提示,此时可以查看docker进程状态 systemctl status dokcer
⑤.docker run hello-world(这个时候服务器会拉取hello-world镜像,运行一下并自动结束,此时docker ps 查看不到当前运行的docker,但是通过docker ps -a 可以看到hello-world镜像是存在的)

上面的操作如果是用root进行登录操作的话,那么一切都是正常的,如果用的是非root的用户,则进行docker进程操作的时候会被提示

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied

原因是因为:docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决方案:
1、使用sudo获取管理员权限,运行docker命令,如:

sudo docker ps -a

2、在安装docker时,已经创建了一个名为docker的用户组,守护进程启动的时候,会默认赋予用户组docker读写Unix socket的权限,因此只要将当前用户加入到docker用户组中,那当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令

sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组
docker ps -a    #测试docker命令是否可以使用sudo正常使用

添加docker的配置文件,让docker的下载速度更快

  • vi /etc/docker/daemon.json
    (进行文件修改)
    添加如下代码,可以直接复制上去
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com"
  ]
}
  • esc(退出编辑状态)
  • :wq(退出编辑界面并保存当前修改)
  • :w!(退出编辑界面并强行写入)
  • :q!(强行退出)
  • sudo systemctl daemon-reload
  • sudo systemctl restart docker(重启服务)

注意:如果此时编辑完文件之后:wq的时候,提示
E45:“readonly” option is set(add ! to override)
可以输入 :set noreadonly 将文件改为非只读的,然后:wq保存并退出
如果又提示

E212: Can't open file for writing

意思是当前用户权限不够,普通用户用vi 进行不了保存,需要使用超级用户才可以
命令:sudo su 转换成超级用户
:wq 即可保存退出

另外,daemon.json也可以配置下面的docker中国区镜像

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

4.安装一个nginx

  • docker pull nginx(拉取一个nginx镜像)
  • docker images nginx(查看通过docker拉取的所有nginx镜像,image在docker中就代表镜像的意思)
  • mkdir www(创建一个www文件夹)
  • echo 'hello docker!!' >> www/index.html(写代码hello docker!!到www文件夹里的index.html文件中)
  • cat www/index.html(查看并打印指定位置的代码)
  • docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx
    (映射当前nginx的80端口到服务器的8000端口,并把www文件夹映射nginx的默认目录中,-d是让nginx后台启动的意思,成功启动会打印一串字符,是当前启动程序的uuid)
  • docker ps(查询docker进程)
  • docker ps -a(查询所有的docker容器,不管有没有启动)
  • docker stop c99(停止服务,c99是刚才启动的nginx容器的uuid前三位)
  • docker start c99(启动服务)

在这里,我们输入命令行的地方,也就是当前所在位置一直都是当前服务器的根目录,如果我们想访问docker的内部,其实docker也就相当于当前linux里面的一个小的linux,一个小的虚拟机

  • docker exec -it c99 /bin/bash(此时命令行的前缀就不是刚才的linux的id了,而是当前进去的docker的uuid,接下来访问一下刚才写的代码,并退出当前所在的docker容器)


    exit.png
  • docker rm c99(删除镜像,运行着的是不能直接删的,可以先docker stop c99停止要删除的docker)

5.安装一个mysql

创建一个在3306端口的容器名称为mysql的Mysql容器,并在后台持续运行
docker run -itd --name mysql -p -d 3306:3306 -e MYSQL_ROOT_PRD=123456 mysql
指令解析:
docker run 命令来创建
itd交互式终端后台运行
name指定容器名称
p指定映射端口
最后Mysql比较特殊,需要指定MYSQL_ROOT_PASSWORD变量
如果安装成功了,则可以通过数据库的可视化工具如navicat,连接这个mysql

6.DockerFile定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
需求实现:根据刚才我们拉取的nginx镜像,我们通过Dockerfile,添加一个非常简单的网页,实现定制镜像

  • 连接服务器,并cd source/docker进入到docker镜像,此时ls查看文件列表,当前镜像是空的
  • mkdir nginx(创建一个nginx目录)
  • vi Dockerfile(编辑定制镜像的描述文件,按Insert进入编辑模式,并输入以下代码)
  • FROM nginx:latest
    RUN echo '<h1>Hello, myProfile!</h1>' > /usr/share/nginx/html/index.html
    (定制镜像的来源是最新版的nginx,大于号是输出的意思)
  • esc推出编辑模式,:wq存盘退出,此时再次ls会发现当前docker文件夹下有两个文件夹了:Dockerfile nginx
  • mv Dockerfile nginx/(把Dockerfile文件移到nginx目录下)
  • cd nginx/(进入到nginx文件夹,接下来开始定制镜像)
  • docker build -t nginx:myProfile .(定制的镜像名字是nginx:myProfile,点的意思是定制的镜像是在当前目录下)
  • docker run -p 8000:80 nginx:myProfile(运行我们刚才定制的镜像)
  • 此时就可以通过公网ip:8000访问到刚才我们定制的内容,这里是Hello, myProfile!

7.定制NodeJS镜像

首先还是连接远程服务器,然后cd source/docker,此时ls,当前只有刚才建立的nginx文件夹,我们建立一个新的文件夹,mkdir node

  • cd node
  • npm init -y(将这个node文件初始化为npm项目)
  • npm i koa -S(安装koa)
  • cat package.json(看看koa是否安装成功)
  • vi app.js(编辑入口文件,因为只是简单的几行代码,我们直接在命令行工具中手敲)
const Koa = require('koa')
const app = new Koa()
app.use(ctx =>{
    ctx.body = 'Hello NodeJS !!!'
})
app.listen(3000, () => {
    console.log('app started at 3000')
})
  • vi Dockerfile(定制Dockerfile)


    定制Dockerfile.png
  • 输入完成后esc+:wq退出

  • docker build -t mynode(试一下定制镜像是否成功,先建立镜像,最后的点的意思是定制的镜像是在当前目录下)

  • docker run -p 3000:3000 mynode(启动镜像)

  • 这里的启动遇到个小插曲,因为有别的程序占用了当前服务器的3000端口,所以第一次启动失败了,此时我们通过docker ps指令,看到有个镜像占用了这个端口,这个镜像的containerID(也就是前面说的uuid)是307xxxxxx,接下来我们通过docker stop 307关闭掉这个镜像,然后再次启动,此时通过公网IP就可以正常访问刚才我们启动的node了

8.定制PM2

node运行的时候一般都会使用pm2,首先还是连接远程服务器,然后cd source/docker,pm2是基于node的,所以我们将刚才做的node文件夹拷贝一份,并命名成pm2,cp -R node pm2,,然后cd pm2进入到pm2文件夹

  • vi process.yml(建立一个process.yml的文件去描述pm2的运行过程)
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
  • vi Dockerfile(编辑Dockerfile这个文件)
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \
npm i
EXPOSE 3000
CMD ["pm2-runtime", "start", "process.yml"]

(pm2在docker中使用命令为pm2-docker,&& 把两个命令连接成了一个命令,\代表回车)

  • docker build -t mypm2(编译)
  • docker run -p 3000:3000 -d mypm2(运行)
  • docker stop bc8(关闭)

9.初识docker-compose

如果需要启动很多个docker容器,则需要很多docer runxxxxx, docker start命令,这样操作又会十分的麻烦,docker compose可以对多个docker容器进行管理

  • apt install docker-compose(安装)
  • mkdir docker-compose(新建一个docker-compose文件夹)
  • cd docker-compose
  • vi docker-compose.yml(新建一个描述文件)
version: '3.1'
services:
image: hello-world
  • docker-compose up(启动,正常情况下启动之后命令行工具会打印出来当前docker-compose的运行日志,这样就代表docer-compose安装成功)

docker-compose项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,接下来演示一下通过docker-compose快速安装mongo和mongo的客户端mongo-express,首先连接服务器,然后cd source/docker

  • mkdir mongo
  • cd mongo
  • vi docker-compose.yml
version: '3.1'
services:
mongo:
image: mongo
restart: always
ports:
- 27017:27017
mongo-express:
image: mongo-express
restart: always
ports:
- 8000:8081
  • docker-compose up(运行,正常情况下,此时通过公网IP:8000,可以看到我们安装的mongo express客户端)

  • 还可以将docker-compose.yml配置成下面这样

version:'3'
services:
  mysql1:
    image:mysql
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    ports:
    - 28002:3306

  mysql2:
    image:mysql
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    ports:
    - 28003:3306
  • 保存编辑之后,docker-compose up -d


    两个mysql成功在后台运行.png
  • 这时候使用navicat可以连接这两个mysql

  • 安装docker-compose的时候,可以通过sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose命令拉取,然后通过 chmod +x /use/local/bin/docker-compose(增加指定路径的执行权限 )

  • docker-compose和docker命令一样,也有run,也有start,也有stop,也有rm,docker-compose stop 可以停止服务

10.初识docker Hub

hub.docker.com是docker的镜像管理网站,就像前端的npm,都可以上传专属于自己的包/镜像
官网上点击myprofile查看自己上传的镜像,在本地装了docker之后,就可以通过docker login 输入账号密码登录docker hub,通过docker ps查看当前服务器的所有docker,以刚才安装的mysql为例,确定自己想要提交的docker的container id,然后docker commit containId 账号/mysql:1.0
docker images可以看到刚才提交的容器已经有了,然后docker push把镜像推到远程的docker hub上


示意图.png

如果推送成功了,在另外一台安装了docker,但是没有安装刚才我们推送的镜像的机器上,通过docker images可以证明并没有安装刚才的镜像
docker pull 账号名/mysql1.0,可以快速把刚才我们自己上传的镜像拉下来。

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