Docker安装与应用
一、docker安装
1、快捷安装
快捷安装参考:https://get.daocloud.io/#inst...curl -sSL https://get.daocloud.io/docker | sh
2、手动安装
1.)先查看内核,更新yum包
docker要求CentOS系统的内核版本>3.10$ uname -r $ sudo yum update
2.)安装依赖包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.)设置国内docker镜像源
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.)如果安装过,卸载旧版本
$ sudo yum remove docker docker-common docker-selinux docker-engine
5.)查看仓库中所有docker,安装
$ yum list docker-ce --showduplicates | sort -r $ sudo yum install docker-ce $ docker -v # 测试
3、启动/关闭docker服务**
$ sudo systemctl start docker $ sudo systemctl stop docker # 加入随机启动 $ sudo systemctl enable docker
二、docker常用命令
每次使用docker命令都需要sudo,比较麻烦,可以通过以下命令添加当前用户到docker附属组:$ sudo usermod -aG docker 当前用户名 # 需要注销后登录生效
1.)查看容器/镜像
$ docker ps # 查看本地容器 $ docker images # 查看本地镜像 # 查看容器详情 $ docker inspect xxx # 查看容器top进程 $ docker top xxx
2.)下载镜像
创建容器前,可先下好远程镜像,也可以在创建时再下载# 先查找远程镜像 $ docker search xxx $ docker pull xxx
3.)新建容器
最少参数的创建# -d:表示后台运行,-it:表示以交互的方式创建,可视化时可通过console打开 $ docker run -d -it --name 容器名 --restart always 镜像名更多参数:映射端口、dns、持久存储卷、初始化进程防容器退出
# -p:映射端口,--dns:有些容器默认dns解析服务配置不对(/etc/resolv.conf),-v:映射路径(可重复多个),/bin/sh:保持一个进程运行,否则容器会退出 $ docker run -dit -p 宿主端口:容器端口 --dns=8.8.8.8 --name 容器名 -v 宿主路径:容器路径 --restart always 镜像:标签 /bin/sh
docker中安装centos无法使用systemctl命令管理进程,报以下错误:
Failed to get D-Bus connection: Operation not permitted
docker run -dit --privileged 其它参数 init
4.)启动/停止容器
$ docker start | restart xxx # 启动/重启 $ docker stop xxx # 停止容器 $ docker kill xxx # 强行终止,关闭进程
5.)进入容器
# 多窗口同时进入,会同步显示,容易窗口阻塞,适合本地开发 $ docker attach xxx # 或者,docker在1.3.X版本,新命令 $ docker exec -it xxx /bin/bash
6.)删除容器/镜像
# 删除容器前,先停止 $ docker stop xxx $ docker rm xxx # 删除镜像 $ docker rmi xxx # -f 强制删除
7.)容器/镜像改名
# 容器改名 $ docker rename 原容器名 新容器名 # 镜像改名 $ docker tag 原镜像 新镜像 # 会生成一个新名,镜像id一样 $ docker rmi 原镜像
三、镜像构建
1、手动构建镜像
用基础镜像创建一个容器,手动安装好一切,然后用容器生成镜像:$ docker commit 容器名 新镜像名
2、自动构建镜像:Dockerfile
1.)Dockerfile配置
新建Dockerfile并配置相关内容,下面以配置一个基于alpine的pm2安装并运行node应用为例:# 基础镜像源 FROM alpine # 创建者信息 MAINTAINER hoby <[email protected]> #修复时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo 'Asia/Shanghai' > /etc/timezone # RUN命令:构建过程中执行,常用于安装软件包 RUN echo 'nameserver 8.8.8.8' >> /etc/resolv.conf \ && apk update \ && apk add bash \ && apk add nodejs && apk add npm \ && npm config set registry https://registry.npm.taobao.org \ && npm i -g pm2 # 指定工作目录,用绝对 WORKDIR /app # 从宿主机copy到容器 #COPY ./www.js /app # 与COPY类似,但ADD自带解压功能 #ADD ./x.tar.xz /app # 定义环境变量 ENV NODE_ENV=production # 配置entrypoint入口脚本 RUN echo 'console.log("this is node web!")' > ./www.js \ && echo '#!/bin/bash' > ./entrypoint.sh \ && echo 'pm2 start /app/www.js' >> ./entrypoint.sh \ && echo '/bin/sh' >> ./entrypoint.sh \ && chmod a+x ./entrypoint.sh # 容器启动后执行的命令,且不可被docker run提供的参数覆盖 ENTRYPOINT ["/bin/sh", "./entrypoint.sh"] # 容器启动后默认执行的命令,可被docker run后面的参数代替 #CMD ["/bin/sh"] # 暴露端口 EXPOSE 80运行构建命令:
$ docker build -t myimage:latest . # 镜像名需小写 # 新建并启动容器 $ docker run -dit -p 8000:80 --dns=8.8.8.8 --name 容器名 --restart always myimage:latest
2.)Dockerfile构建总结
a. 构建时下载不了软件包,说明容器dns不对,需修改/etc/resolv.confb. alpine镜像默认sh终端,需安装bash
c. 建议一个容器只运行单个应用,多个应用见下文compose部署
d. Docker镜像构建是分层,将多个RUN指令合并
e. -v持久化路径时,若宿主机路径是新建的,容器路径内容会被清空
f. 当ENTRYPOINT与CMD使用exec参数时需双引号
g. 添加.dockerignore,提高编译速度:
.git/ node_modules/
四、多个应用容器部署
Docker Compose是一个管理多容器应用的工具1、docker-compose安装
Compose下载地址: https://get.daocloud.io/#inst...curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
2、docker-compose文件配置
新建docker-compose.yml,下面以nginx+node+mongo+redis联合容器配置为例:version: '3' services: web: image: nginx container_name: encore-web restart: always ports: - 18001:8001 volumes: - ./bin/nginx.conf:/etc/nginx/conf.d/encore.conf - ./web/dist:/app/encore/web command: ['nginx', '-g', 'daemon off;'] links: - server server: image: keymetrics/pm2 container_name: encore-server restart: always ports: - 18100:8100 volumes: - ./server:/app/encore/server working_dir: /app/encore/server environment: - MONGO_SERVER=mongo - MONGO_PORT=27017 - REDIS_SERVER=redis - REDIS_PORT=6379 command: npm start links: - mongo - redis mongo: image: mongo container_name: encore-mongo restart: always ports: - 18017:27017 volumes: - ./mongo/configdb:/data/configdb - ./mongo/db:/data/db command: mongod --auth redis: image: redis container_name: encore-redis restart: always ports: - 18379:6379 volumes: - ./redis/data:/data - ./bin/redis.conf:/usr/local/etc/redis.conf command: redis-server /usr/local/etc/redis.conf需要注意的:
a.) command支持exec和shell两种模式(见上面的web和server)
b.) nginx、pm2等进程需加--no-daemon参数使其在前台运行,以保证容器不退出
c.) npm start需要设置工作目录
d.) links后,在容器可直接把服务名做为一个hostname访问,如下:
# nginx反向代理 proxy_pass http://server:8100/; # mongo连接 mongodb://mongo:27017/encore # node容器可先设置环境变量,再动态获取 'mongodb://www:123456@' + process.env.MONGO_SERVER + ':' + process.env.MONGO_PORT + '/encore'
在docker-compose.yml同目录下,创建启动/更新容器:
$ docker-compose up -d # -d后台运行
3、docker-compose常用命令
在docker-compose.yml同一目录下# 创建并启动容器 $ docker-compose up -d # 重启容器 $ docker-compose restart # 查看yml配置 $ docker-compose config # 停止容器 $ docker-compose stop # 停止并移除容器 $ docker-compose down
五、可视化容器管理工具
Portainer是一个轻量级的Docker环境UI界面管理系统1、快速部署
$ docker volume create portainer_data # 在宿主机创建持久化目录 $ docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
2、相关配置
1.)交互模式
创建容器时,在高级设置里,Console项记得勾选交互模式,否则无法使用控制台- [x] Interactive & TTY (-i -t)
2.)入口命令
在容器高级设置里,command里的shell命令必须单个加引号,如:Command: 'pm2' 'start' './www.js' '--no-daemon' Working Dir: /app
3.)volume添加
portainer中volume默认在/var/lib/docker/volumes下,通过点击bind按钮修改/自定义对应的host路径相关推荐
changecan 2020-11-19
changecan 2020-09-22
魅惑青花瓷 2020-11-11
yangkang 2020-11-09
MichaelJScofield 2020-11-06
TaoTaoFu 2020-11-06
liaochaowu 2020-11-16
ChlatZed 2020-11-11
lnkToKing 2020-10-29
ChlatZed 2020-10-27
ChlatZed 2020-10-13
时光流水 2020-09-23
yangkang 2020-09-23
dusuanyun 2020-09-21
newisI 2020-09-01
liaochaowu 2020-09-14
ShangQuan0 2020-09-10
fearlessxjdx 2020-09-04
libra0 2020-09-02