docker安装

时间:2019-09-24
本文章向大家介绍docker安装,主要包括docker安装使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

拿到一个全新的阿里云服务器后,使用ssh进入服务器,执行以下步骤

1、apt升级

sudo apt-get update

2、添加相关软件包

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

3、下载软件包的合法性,需要添加软件源的 GPG 秘钥

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

4、source.list 中添加 Docker 软件源

sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"

5、安装 Docker CE

sudo apt-get update
sudo apt-get install docker-ce

6、启动 Docker CE

# 添加docker服务
sudo systemctl enable docker

# 启动docker
sudo systemctl start docker

7、建立 docker 用户组(附加、可以不用)

# root权限比较高
# 如果是个人服务器,只需要用root的话,这一步可以跳过
sudo groupadd docker
sudo usermod -aG docker $USER

8、 Helloworld 测试

docker run hello-world

9、镜像加速

# 加入微软云和七牛云
# 进入daemon.json文件,进行编辑
vi /etc/docker/daemon.json

# 将以下内容弄进去
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com"
  ]
}

# 重启docker服务,让它生效

sudo systemctl daemon-reload
sudo systemctl restart docker

安装一个简单的 Nginx 服务

以下步骤在docker安装完成之后

1、拉取官方镜像 - 面向docker的只读模板

docker pull nginx

# 安装完成后,查看安装结果
docker images nginx

2、创建一个页面,把它发布出去

mkdir www

# 建立一个网页
echo 'Hello docker!!!' >> www/index.html

# 查看一下
cat www/index.html

# -p代表端口映射
# 把它发布在我们服务器的8000端口上
# 映射到nginx的80端口
# 因为nginx默认的服务是80端口
# /usr/share/nginx/html  这个是nginx的默认目录

docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html nginx

# 测试一下,在本机浏览器输入以下网址
http://00.00.00.00(IP地址):8000

# 会显示 “Hello docker!!!” 就代表成功
# 这种情况实际上是用命令行来启动,如果我们想让他后台执行的话(实际上就是后台模式)
docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html -d nginx

# 会返回一个UUID
# 查看docker进程
docker ps

# 如果我们想停止这个服务的话,只需要打前三位
# 例如:其中c99是UUID的前三位
docker stop c99

# 如果想重新启动
docker start c99

#如果在停止的情况下,使用docker ps查询不到,因为它没有被允许,此时可以用以下命令来查询所有
docker ps -a

3、如果想进入docker内部(docker实际上是一台linux服务器),进入伪终端

docker exec -it c99 /bin/bash

# 此时已经进来了,可以确认一下刚刚的网页
cd /usr/share/nginx/html

cat index.html

# 可以看到  Hello docker !!!
# 退出
exit

4、删除这个docker镜像

docker rm c99

Dockerfile定制镜像(定制一个nginx镜像)

镜像的定制实际上就是定制每一层所添加的配置、文件。

如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,

用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。

这个脚本就是 Dockerfile

1、配置Dockerfile文件

cd source/docker

mkdir nginx

cd nginx

# 定制镜像的描述文件

vi Dockerfile


# 将以下内容弄进 Dockerfile文件
FROM nginx:latest
RUN echo '<h1>Hello Dockerfile !!!</h1>' > /usr/share/nginx/html/index.html

2、定制镜像

# 在 /source/docker/nginx 下
# 定制nginx的版本为 mynginx
# . 的意思是,我的镜像定制文件(Dockerfile)在当前目录下
docker build -t nginx:mynginx .

3、试验一下是否成功

docker run -p 8000:80 nginx:mynginx

# 在本机访问 http://00.00.00.00(IP地址):8000
# 可以看到内容,就表示成功

定制一个NodeJS镜像

进入 /source/docker 目录

mkdir node 

cd node

# 先初始化一个npm的项目
npm init -y

# 加一个包
npm i koa -S

# 看一下
cat package.json

# 写一个最简单的程序
vi app.js

# 将下面代码弄进 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')
})

# 定制Dockerfile
vi Dockerfile

# 将下面代码弄进 Dockerfile 文件
# 这个实际上是一个经典linux系统的node10版本
# 把宿主机上当前目录添加到app目录下
# WORKDIR 相当于进入app目录
FROM node:10-alpine
ADD . /app/
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]

试一下定制镜像是否成功

docker build -t mynode .

试一下运行效果

docker run -p 3000:3000 mynode

# 这里如果不行,可能是原来的没有关闭掉
# 使用 docker ps 命令查看
# 使用 docker stop 307 命令关闭,其中 307  是uuid 的前三位 

在本机访问 http://0.0.0.0(服务器ip):3000  可以看到运行效果

定制PM2镜像

在node使用的时候,很少用node直接去运行,一般会使用PM2这样一个进程守护的程序

通过这样一个程序去运行node

PM2:利用多核资源

node程序

# 将上面的node程序拷贝过来
cd source/docker

cp -R node pm2

cd pm2

1、pm2运行的时候,我们一般使用process.yml 文件来描述它的运行过程

vi process.yml

# 将下面代码弄进 process.yml文件
apps:
  script: app.js
  instances: 2
  watch: true
  env:
    NODE_ENV: production

2、然后我们编辑Dockerfile文件

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"]

3、试验一下是否成功

docker build -t mypm2 .

docker run -p 3000:3000 -d mypm2

# 然后在本机访问 http://0.0.0.0(IP地址):3000
# 可以看到的话,就代表成功
# 会返回一个UUID:假设为 bc8896214hkjnduu......

# 关掉
docker stop bc8

Compose安装

apt install docker-compose

# 试验一下是否安装成功
mkdir helloworld

vi docker-compose.yml

# 将下面代码弄进去
version: '3.1'
services:
  hello-world:
    image: hello-world

# 启动
docker-compose up
# 如果能打印出日志,说明没有问题,安装完毕

简介:Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

一句话概括:如果好几个Docker想一起工作,就用 Compose

下面来安装MongoDB以及MongoDB-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

# 在本机访问 http://0.0.0.0(IP地址):8000  就可以看到页面(需要在阿里云配置开启外部访问8000端口)

使用docker来部署一个前后端分离的项目

这里使用夏老师的 docker_cli 项目 :后端使用的nodejs,前端使用的是taro,使用mongodb数据库

https://github.com/su37josephxia/docker_ci

需要的效果:本地修改代码,可以随时同步的服务器上面去

使用vscode的 Deploy 插件

首先建立一个.vscode文件夹(夏老师的项目里面已经建过了)

里面新建 settings.json 文件

// files: **/* 代表所有的文件
// exclude: 把里面的东西例外出去
// deployOnSave:如果选 true ,每次保存文件都会自动进行同步
// targets 部署到什么地方
// name: 随便写
// dir: 传到服务器的什么目录下
// host:服务器地址
// privateKey: 私钥,登录需要的私钥地址
{
    "deploy":{
        "packages": [{
            "files": [
                "**/*"
            ],
            "exclude": [
                "node_modules/**",
                ".git/**",
                ".vscode/**",
                "**/node_modules/**"
            ],
            "deployOnSave": false
        }],
        "targets": [{
            "type": "sftp",
            "name": "AliyunServer",
            "dir": "/root/source/docker_cli",
            "host": "00.00.00.00",
            "port": 22,
            "user": "root",
            "privateKey": "/User/xia/.ssh/id_rsa"
        }]
    }
}

下载好项目后,在 docker_cli 目录新建一个文件夹: nginx

在nginx中新建一个文件夹:conf.d

在conf.d中新建一个文件:docker.conf

server {
    listen  80;
    location / {
        root    /var/www/html
        index   index.html index.htm;
    }

    location ~ \.(gif|jpg|png)$ {
        root /static;
        index index.html index.htm;
    }
}

右键 docker.conf 文件,选择 Deploy

在服务器查看

cd /source/docker_cli

cat nginx/conf.d/docker.conf

# 如果里面有内容,则说明上传成功

接着在项目的根目录下,建立一个文件:docker-compose.yml

version: '3.1'
services:
    nginx:
        restart: always
        image: nginx
        ports:
            - 8091:80
        volumes:
            - ./nginx/conf.d/:/etc/nginx/conf.d
            - ./frontend/dist:/var/www/html/
            - ./static/:/statoc/

然后将此文件 Deploy 一下

然后在服务器中

/source/docker_cli  下

执行命令:docker-compose up

然后在本机访问:http://0.0.0.0(IP地址):8091   (阿里云默认是不打开8091端口的,需要在阿里云设置一下)

可以访问到前端页面

下面配一下后端

在项目的 backend 文件夹下新建一个文件:process.yml

apps: 
    - script: server.js
      instances: 2
      watch: true
      env:
        NODE_ENV: production

在 backend文件夹下新增一个文件: .dockerignore

node_modules

在 backend文件夹下新增一个文件: 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

# pm2在docker中使用命令为 pm2-docker
CMD ["pm2-runtime", "start", "process.yml"]

修改backend/models文件夹下 conf.js 文件

本来为:

module.exports = {
    url: "mongodb://localhost:27017",
    dbName: 'taro'
}

改为:

// mongo 是一个域名:在docker内部使用的一个域的域名
module.exports = {
    url: "mongodb://mongo:27017",
    dbName: 'taro'
}

接下来在nginx上进行反向代理

修改 nginx/conf.d/docker.conf 文件

server {
    listen  80;
    location / {
        root    /var/www/html
        index   index.html index.htm;
    }

    location ~ \.(gif|jpg|png)$ {
        root /static;
        index index.html index.htm;
    }

    location /api {
        proxy_pass http://app-pm2:3000
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

修改 docker-compose.yml 文件

version: '3.1'
services:
  app-pm2:
    container_name: app-pm2
    # 构建容器
    build: ./backend
    ports:
      - "3000:3000"
  mongo:
    image: mongo
    restart: always
    ports:
      - 27017:27017

然后将 backend  nginx  docker-compose.yml  这三个文件都Deploy一下

在服务器中  /source/docker_cli 下,将服务关掉

docker-compose down   

看一下有没有同步过来

cat docker-compose.yml

cat backend/Dockerfile

cat nginx/conf.d/docker.conf

运行一下

docker-compose up

在本机访问 http://0.0.0.0:8091

可以看到页面就代表成功

原文地址:https://www.cnblogs.com/haishen/p/11577176.html