Docker

Docker

Docker是什么

  1. Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。(类似与Windows的镜像机制,不需要在多个linux上重新安装mysql,redis等,直接启动容器即可)
  2. Docker核心概念
	1. docker主机(host):安装了Docker程序的机器(安装在操作系统上)
	2. docker客户端(client):连接docker主机进行操作(命令行或工具)
	3. docker仓库(registry):用来保存各种打包好的软件镜像(公共仓库docker hub)
	4. docker镜像(images):软件打包好的镜像;放在docker仓库中
	5. docker容器(Container):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用

Docker优势

1. 更高效的利用系统资源
	Docker不需要硬件虚拟和运行完整操作系统等额外开销,资源利用率更高。相同配置的主机,可以运行更多的应用
2. 更快的启动时间
	传统虚拟机应用服务启动往往需要数分钟,Dokcer直接运行于宿主内核,启动可以做到秒级甚至毫秒级。
3. 一致的运行环境
	Docker提供了除内核外一致的运行环境。可以在开发,测试,部署上保持一致
4. 持续交付和部署
	Docker可以通过定制应用镜像实现持续集成、持续交付、部署,通过Dockerfile进行镜像构建
5. 更轻松的迁移
	Docker可以在很多平台运行(物理机、虚拟机、阿里云等等),结果是一致的。
6. 更轻松的维护和扩展
	Docker使用分层存储以及镜像的技术,使得应用重复部分复用更加容易,进一步扩展更加容易。

Docker使用

  1. 安装Docker
    1).检查内核版本,必须是3.10版本以上
    uname -r
    2).脚本安装docker
    curl -fsSL get.docker.com -o get-docker.sh
    3)修改源
    	sudo sh get-docker.sh --mirror Aliyun
    
  2. 修改数据源
	1. vim /etc/docker/daemon.json  (第一次不存在,创建)
	2. 增加内容
		{
		  "registry-mirrors": [
		    "https://registry.docker-cn.com"
		  ]
		}
	3. systemctl restart docker
	4. docker info 查看是否修改完成

docker 启动命令

	1).启动docker
		systemctl start docker
	查看docker版本  docker -v
	2). 可以设置开机启动docker(脚本安装默认自动开启)
		systemctl enable docker
	3).停止docker
		systemctl stop docker 

docker常用命令

  1. 查询(搜索)文件
    docker search mysql
  2. 拉取(镜像都是docker.hub上的(推荐docker中国加速拉取))
    docker pull mysql 不指定版本默认最新(docker pull mysql:5.7) :tags可以指定版本
    加速版:docker pull registry.docker-cn.com/library/mysql
  3. 查看所有本地镜像
    docker images
  4. 删除镜像
    docker rmi +(镜像的image_id)

容器操作

软件镜像–》运行镜像–》产生一个容器(正在运行的软件)
运行步骤:

  1. 搜索镜像
    docker search tomcat
  2. 拉取镜像
    docker pull tomcat
  3. 根据镜像启动容器
    docker run --name mytomcat -d tomcat:latest
    –name 制定容器名
    -d 后台运行
    要运行的镜像:版本号 :latest可以省略
    -p 8080:8080 虚拟机的8080映射到容器的8080
    –name 指定容器名
  4. 查看在运行的镜像
    docker ps
    docker ps -a 查看所有容器
  5. 停止容器
    docker stop 名字或容器id
  6. 启动容器
    docker start 容器id
  7. 删除容器
    docker rm 容器id
    docker container prune 删除所有未运行的容器
  8. 外部可以访问(映射端口)
    docker run -d -p 8888:8080 tomcat (-name可以不知道 -d后台运行 -p映射端口)
    要开放linux的防火墙端口 或关闭防火墙 service firewalld stop
    一个镜像可以启动多个容器 用不同端口映射
  9. 查看容器的日志
    docker logs container-name/container-id
    docker logs -f container-name/container-id 一直监听日志变化
  10. 交互方式启动容器
    docker run -it 镜像名 bash
  11. 交互方式操作容器
    docker exec -it 容器id bash

虚悬镜像

docker pull和docker build会出现标签名和版本为none的虚悬镜像,
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
docker rmi $(docker images -q -f dangling=true)

Dockerfile定制镜像

  1. mkdir /usr/local/docker
  2. cd /usr/local/docker
  3. 创建文件夹(如tomcat),再vim Dockerfile
  4. FROM 指定基础镜像 RUN 执行命令
  5. docker build构建镜像
例子 
	Dockerfile
		FROM tomcat
		WORKDIR /usr/local/tomcat/webapps/ROOT/
		RUN rm -rf *
		RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html
	
在Dockerfile文件所在目录下执行build命令
	docker build -t mytomcat .
	不指定默认为mytomcat:laster  .代表构建上下文

在这里插入图片描述

镜像构建上下文(Context)
	1. docker是C/S结构,其实是通过REST API来远程调用Server的,docker build其实是在Server端执行的。
在执行该命令时,会将当前目录打包发送到Server端。如果在 Dockerfile 中写COPY ./package.json /app/,
复制的是上下文(context) 目录下的 package.json,所有经常会出现COPY ../package.json指令无法执行的问题。
真的需要那些文件,应该将它们复制到上下文目录中去。
Docker指令
1. WORKDIR
	指定当前的工作目录
2. RUN
	启动一个容器
3. FROM
	指定镜像基础(父类)
4. COPY
	可以复制文件
5. ADD
	可以向容器中添加tar包,并且自动解压缩并删除tar包
6. ENV
	设置环境变量
7. EXPOSE
	暴漏端口
8. CMD
	类似与RUN,启动容器

tomcat Dockerfile参考

Dokcer 数据卷
容器类似于对象,一旦销毁,容器内的数据一并删除。
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除

使用:
-v 宿主机路径(数据卷):容器路径

例子:
	docker run -p 8080:8080 --name tomcat -d -v /usr/local/docker/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT tomcat
数据卷映射mysql
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.22
在conf/mysql.conf.d/mysqld.cnf追加max_allowed_packet = 128M
echo "max_allowed_packet = 128M">>mysqld.cnf

Docker Compose

Docker Compose用于启动服务(多个镜像启动).

安装

安装Docker时,同时安装compose
curl -L https://github.com/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  
docker-compose version  检测是否安装完成

使用

docker-compose up 启动服务
docker-compose up -d 后台启动服务
docker-compose down 关闭服务
docker-compose logs [-f] [动态]查看日志
在/usr/local/docker/服务名/建立docker-componse.yml文件,docker-compose命令在该目录下执行。

docker-compose.yml写法

可以将项目打包后的WEB_INF等文件放入docker-compose.yml同一目录的ROOT文件下,数据源映射到容器的ROOT下。
第二种volumes没有数据卷映射时,可以起名字统一在后面写,docker-compose会在var/lib/docker/下创建数据卷volumes。
version: '3'
services:
  web:
    restart: always
    image: tomcat
    container_name: web
    ports:
      - 8080:8080
    volumes:
      - /usr/local/docker/statement/ROOT:/usr/local/tomcat/webapps/ROOT

  mysql:
    restart: always
    image: mysql:5.7.22
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_USER: 'wzh'
      MYSQL_PASS: 'yali'
      TZ: Asia/Shanghai
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:
      - mysql-data:/var/lib/mysql
      - mysql-logs:/var/log/mysql
      - mysql-conf:/etc/mysql
volumes:
  mysql-data:
  mysql-logs:
  mysql-conf:

启动容器注意事项

需参考docker hub各个容器安装事项(如mysql需指定密码,否则安装后不能启动)
不指定版本默认最新

tomcat安装
  1. docker pull tomcat
  2. docker run --name tomcat -d -p 8080:8080 tomcat
mysql安装
  1. docker pull mysql:5.7
  2. docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD mysql:5.7
  3. 安装最新版(MySQL8.0)采用新的更安全的验证方式,会导致连接不上,可以修改版本或去设置
    设置
	1. sudo docker exec -it mysql(容器id) /bin/bash
	2. mysql -uroot -p
	3. 密码
	4. ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
docker-compose.yml安装
version: '3.1'
services:
  mysql:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    ports:
      - 3306:3306
    volumes:
      - ./data:/var/lib/mysql
redis安装
  1. docker pull registry.docker-cn.com/library/redis
  2. docker run -p 6379:6379 -d --name redis redis
    默认redis没有密码
redis-cluster安装
无密码
docker-compose.yml
version: '3'

services:
 redis1:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7000/data:/data
  environment:
   - REDIS_PORT=7000
  ports:
    - '7000:7000'       #服务端口
    - '17000:17000'   #集群端口

 redis2:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7001/data:/data
  environment:
   - REDIS_PORT=7001
  ports:
    - '7001:7001'
    - '17001:17001'

 redis3:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7002/data:/data
  environment:
   - REDIS_PORT=7002
  ports:
    - '7002:7002'
    - '17002:17002'

 redis4:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7003/data:/data
  environment:
   - REDIS_PORT=7003
  ports:
    - '7003:7003'
    - '17003:17003'

 redis5:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7004/data:/data
  environment:
   - REDIS_PORT=7004
  ports:
    - '7004:7004'
    - '17004:17004'

 redis6:
  image: publicisworldwide/redis-cluster
  restart: always
  volumes:
   - /data/redis/7005/data:/data
  environment:
   - REDIS_PORT=7005
  ports:
    - '7005:7005'
    - '17005:17005'
docker run --rm -it inem0o/redis-trib create --replicas 1 192.168.79.140:7000 192.168.79.140:7001 192.168.79.140:7002 192.168.79.140:7003 192.168.79.140:7004 192.168.79.140:7005
有密码
Dockerfile
FROM redis
#修复时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV REDIS_PORT 7000

EXPOSE $REDIS_PORT

COPY entrypoint.sh /usr/local/bin/
COPY redis.conf /usr/local/etc/
RUN chmod 777 /usr/local/etc/redis.conf
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["redis-server", "/usr/local/etc/redis.conf"]

编写shell文件entrypoint.sh
#!/bin/sh

set -e

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
	sed -i 's/REDIS_PORT/'$REDIS_PORT'/g' /usr/local/etc/redis.conf
	chown -R redis .
	exec gosu redis "$0" "$@"
fi

exec "$@"
编写redis.conf
#端口
port REDIS_PORT
#开启集群
cluster-enabled yes
#配置文件
cluster-config-file nodes.conf
cluster-node-timeout 5000
#更新操作后进行日志记录
appendonly yes
docker-compose.yml
version: '3'

services:
 redis1:
  build: ./
  container_name: redis7000
  restart: always
  volumes:
   - /data/redis/7000/data:/data
  environment:
   - REDIS_PORT=7000
  network_mode: host

 redis2:
  build: ./
  container_name: redis7001
  restart: always
  volumes:
   - /data/redis/7001/data:/data
  environment:
   - REDIS_PORT=7001
  network_mode: host

 redis3:
  build: ./
  container_name: redis7002
  restart: always
  volumes:
   - /data/redis/7002/data:/data
  environment:
   - REDIS_PORT=7002
  network_mode: host

 redis4:
  build: ./
  container_name: redis7003
  restart: always
  volumes:
   - /data/redis/7003/data:/data
  environment:
   - REDIS_PORT=7003
  network_mode: host

 redis5:
  build: ./
  container_name: redis7004
  restart: always
  volumes:
   - /data/redis/7004/data:/data
  environment:
   - REDIS_PORT=7004
  network_mode: host

 redis6:
  build: ./
  container_name: redis7005
  restart: always
  volumes:
   - /data/redis/7005/data:/data
  environment:
   - REDIS_PORT=7005
  network_mode: host
docker-compose up -d 启动(有时不能下载redis 可以先docker pull redis)
docker-compose build 重新构建镜像

设置密码(6个需要密码一致)
config set masterauth root
config set requirepass 123456
auth 123456
config rewrite
部署问题
1. Node ip is not empty. Either the node already knows other nodes (check with CLUSTER NODES)
 or contains some key in database 0.
 这个异常是因为在目录下/data/redis/已经存在redis的配置文件,要先清除掉。
 rm -rf redis/
 2. Sorry, can't connect to node ip:7000
	find / -name client.rb,添加或修改password,重新部署时,需要把密码设置为nil
redis配置(warn)
redis服务启动三个warn.
1. echo  "vm.overcommit_memory=1" >> /etc/sysctl.conf
2. echo  "net.core.somaxconn= 1024" >> /etc/sysctl.conf
3. echo never > /sys/kernel/mm/transparent_hugepage/enabled  
4. echo "/sys/kernel/mm/transparent_hugepage/enabled" > /etc/rc.local
rabbitMq安装
1. docker pull rabbitmq:3-management
2. docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v /data/rabbitmq:
	/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost 
   -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 db322a6c3b84
   -d 后台运行容器;
	--name 指定容器名;
	-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
	-v 映射目录或文件;
	--hostname  主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
	-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
	RABBITMQ_DEFAULT_USER:默认的	用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
	5672客户端通信端口 15672管理界面访问Web端口
	ip:15672即可访问
elasticSearch安装

安装前查看Springboot仲裁版本号,再下载,否则有冲突。

  1. docker pull registry.docker-cn.com/library/elasticsearch
  2. docker run -d -p 9200:9200 -p 9300:9300 --name es 752be83a5396
    默认2G内存,分布式端口2个,可以 -e ES_JAVA_OPTS="-Xms256m -Xms256m"指定初始内存和最大内存
zookeeper安装
  1. docker pull zookeeper
  2. docker run --name zk --restart always -p 2181:2181 -d 4ebfb9474e72
Docker部署gitlab服务器
1. gitlab所在linux内存最低为2GB
2. 去hub.docker.com上搜gitlab,有中文版的,对应下方有docker-compose.yml,执行即可
version: '2'
services:
    gitlab:
      image: 'twang2218/gitlab-ce-zh'
      restart: always
      hostname: '192.168.1.223'
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://192.168.1.223'
          gitlab_rails['time_zone'] = 'Asia/Shanghai'
      ports:
        - 80:80
        - 443:443
      volumes:
        - config:/etc/gitlab
        - data:/var/opt/gitlab
        - logs:/var/log/gitlab
volumes:
    config:
    data:
    logs:

Docker部署nexus私服

nexus使用步骤
1. docker pull sonatype/nexus3
2. 在/url/local/docker/下建立nexus文件夹,内部写入docker-compose.yml
3. 给data添加权限(创建失败) chmod 777 data/

version: '3.1'
services:
  nexus:
    restart: always
    image: sonatype/nexus3
    container_name: nexus
    ports:
      - 8081:8081
    volumes:
      - /usr/local/docker/nexus/data:/nexus-data
Docker部署Registry和UI页面

Registry仓库使用
1. cd /usr/local
2. mkdir docker/registry -p
3. cd docker/registry/
4. vim docker-compose.yml

version: '3.1'
services:
  registry:
    image: registry
    restart: always
    container_name: registry
    ports:
      - 5000:5000
    volumes:
      - /usr/local/docker/registry/data:/var/lib/registry
  frontend:
    image: konradkleine/docker-registry-frontend:v2
    ports:
      - 80:80
    volumes:
      - ./certs/frontend.crt:/etc/apache2/server.crt:ro
      - ./certs/frontend.key:/etc/apache2/server.key:ro
    environment:
      - ENV_DOCKER_REGISTRY_HOST=ip
      - ENV_DOCKER_REGISTRY_PORT=5000
5. docker-compse up -d
6. 访问路径 ip:5000/v2/

docker问题

容器不能访问外网

1. cat /etc/resolv.conf   复制 nameserver值 xxx.xxx.xxx.xxx
2.  创建或修改 /etc/default/docker 添加DOCKER_OPTS="--dns xxx.xxx.xxx.xxx"
3. systemctl restart docker

docker一体化

文件或war包部署

1. docker所在Linux添加ssh,直接使用ssh-keygen -t rsa -C "1234@qq.com"(没有git时  apt-get install git)
2. cd /root/.ssh  
3. cat id_rsa.pub 添加密钥到git上
4. git clone 代码到/usr/local/docker
5. cd 到项目中
6. mvn打包(mvn clean package -Dmaven.test.skip=true)
7. 将META-INF、static和WEB-INF打包,移入项目在image(新建镜像目录)下,vim dockerfile
8. 编写dockerfile
9. 构建镜像(docker build -t ip:5000/statement .)
10. 上传到镜像仓库(docker push ip:5000/statement)
11. 其他装有docker的服务器即可直接下载镜像运行

dockerfile模板

FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT
RUN rm -rf *
ADD statement.tar.gz /usr/local/tomcat/webapps/ROOT
RUM rm -rf statement.tar.gz
WORKDIR /usr/local/tomcat

SpringBoot jar部署

1. 建立项目目录
2. 将制作的Dockerfile、docker-compose.yml、项目jar包导入,执行
Dockerfile
FROM openjdk:8-jre
RUN mkdir /app
COPY itoken-config-1.0.0-SNAPSHOT.jar /app/
CMD java -jar /app/itoken-config-1.0.0-SNAPSHOT.jar --spring.profiles.active=prod
EXPOSE 8888
docker-compose.yml
version: '3.1'
services:
  itoken-config:
    build: ./
    restart: always
    container_name: itoken-config
    ports:
      - 80:8888
    networks:
      - itoken-config
networks:
  itoken-config:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值