Docker

Docker安装

安装依赖包

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

· 设置阿里云镜像源

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

· 安装 Docker-CE

sudo yum install docker-ce

安装docker-compose

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose -version

GUI管理

这里推荐使用 Portainer 作为容器的 GUI 管理方案。 官方地址:https://portainer.io/install.... 安装命令:

docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

访问你的 IP:9000 即可进入容器管理页面。

Docker部署SpringBoot项目

Dockerfile

# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD mall-tiny-docker-file-0.0.1-SNAPSHOT.jar /mall-tiny-docker-file.jar
# 运行过程中创建一个mall-tiny-docker-file.jar文件
RUN bash -c 'touch /mall-tiny-docker-file.jar'
# 声明服务运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/mall-tiny-docker-file.jar"]
# 指定维护者的名字
MAINTAINER gyt

将应用jar包及Dockerfile文件上传到linux服务器

在Linux上构建docker镜像

在Dockerfile所在目录执行以下命令:

# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfile
docker build -t springboot-study-eureka .

image

查看docker镜像:

docker images

列出容器:

docker ps -a

image

Docker安装Zookeeper

下载Zookeeper镜像:

docker pull zookeeper

启动容器并添加映射

docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:latest

image

进入zookeeper目录:

docker exec -it d5c6f857cd88 bash
./bin/zkCli.sh

启动命令改成以交互是的方式运行镜像,用以kafka连接

docker run --privileged=true -itd --name zookeeper --publish 2181:2181 -d zookeeper:latest

-t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开

Docker安装kafka

docker pull kafka

报错:pull access denied for kafka, repository does not exist or may require 'docker login'

docker search kafka

image

docker pull wurstmeister/kafka

启动kafka:

docker run  -d --name kafka -p 9092:9092 --link zookeeper -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=106.54.121.152:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://106.54.121.152:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
参数说明:
-e KAFKA_BROKER_ID=0  在kafka集群中,每个kafka都有一个BROKER_ID来区分自己

-e KAFKA_ZOOKEEPER_CONNECT=172.16.0.13:2181/kafka 配置zookeeper管理kafka的路径172.16.0.13:2181/kafka

-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.13:9092  把kafka的地址端口注册给zookeeper,如果是远程访问要改成外网IP,类如Java程序访问出现无法连接。

-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口

-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间

启动失败

查看日志发现是内存不足:

docker logs 84ec00e2f6ab

image

决定使用docker-compose启动(安装参考前文)

编辑docker-compose.yml:

vim docker-compose.yml
version: '2'
services:
  zookeeper:
    image: zookeeper   ## 镜像
    ports:
      - "2181:2181"                 ## 对外暴露的端口号
  kafka:
    image: wurstmeister/kafka       ## 镜像
    volumes:
        - /etc/localtime:/etc/localtime ## 挂载位置(kafka镜像和宿主机器之间时间保持一直)
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 106.54.121.152   ## 修改:宿主机IP
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181       ## 卡夫卡运行是基于zookeeper的
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms512M"
  kafka-manager:
    image: sheepkiller/kafka-manager                ## 镜像:开源的web管理kafka集群的界面
    environment:
        ZK_HOSTS: 106.54.121.152                   ## 修改:宿主机IP
    ports:
      - "9001:9000"                                 ## 暴露端口

外网访问配置:

cd /opt/kafka_2.11-1.1.0/config
vi  server.properties 

advertised.listeners=PLAINTEXT://ip:9092

docker-compose.yml脚本存放路径下执行

docker-compose up -d

终于成功了

image

安装kafka-manager

docker pull sheepkiller/kafka-manager

通过http://106.54.121.152:9001/访问kafkamanager

Docker安装jenkins

docker pull jenkins
# 创建目录
mkdir jenkins
# 启动命令(不需要挂载目录)
docker run --name jenkins_study -p 8081:8080 -d jenkins

# 启动命令(需要挂载目录的)
docker run -d --name jenkins_study -p 8081:8080 -v /usr/local/jenkins:/usr/local/jenkins jenkins

## 遇到很多坑后,挂载目录很重要,这样启动后就本地的容器中/var/jenkins_home 目录下的内容就会存入本机的/var/jenkins_home下,密码也可以从这个目录下获取而不用进入容器内部。
mkdir /var/jenkins_home
sudo chown -R 1000 /var/jenkins_home 
docker run -d --name jenkins_study -p 9090:8080 -v /var/run/docker.sock:/var/run/docker.sock -v 
/usr/bin/docker:/usr/bin/docker -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -v /usr/local/jdk/jdk1.8.0_212/bin/java:/usr/local/jdk/jdk1.8.0_212/bin/java  -v /usr/local/jdk/jdk1.8.0_212:/usr/local/jdk/jdk1.8.0_212  -v /usr/local/maven:/usr/local/maven -v /var/jenkins_home:/var/jenkins_home -v /usr/local/jenkins:/usr/local/jenkins -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins

运行容器/实例,需要考虑到本地端口与docker容器的映射,以便通过本地主机可以访问。由于容器本身并不会持久化文件,其实docker不建议在容器中进行任何文件有关的写入操作,仅仅当作一个“容器”使用。如果容器应用运行过程中会产生许多重要的数据需要保存或配置,如mysql的db文件,jenkins的插件、配置文件等,则建议将容器的文件挂载到本地,也即volume映射。

查看Jenkins服务

docker ps | grep jenkins

image

访问http://106.54.121.152:8081/

image

进入容器内部

docker exec -it jenkins_study bash

执行cat /var/jenkins_home/secrets/initialAdminPassword得到密码并粘贴过去

新建用户admin/admin

进入后发现插件无法安装

Docker 方式安装的 Jenkins 版本。解决因 Jenkins 版本过低,而无法安装插件

下载Jenkins的最新war包

cd /usr/local/jenkins/
wget http://mirrors.jenkins.io/war/latest/jenkins.war

以root用户进入容器

docker exec -it -u root jenkins_study bash

查看容器中jenkins war包的位置,并备份原来的war包

whereis jenkins
cd /usr/share/jenkins
cp jenkins.war jenkinsBAK.war

将/usr/local/jenkins/下的包cp到/usr/share/jenkins下覆盖

cp /usr/local/jenkins/jenkins.war /usr/share/jenkins/

退出容器并重启

docker restart jenkins_study 

重启后,显示启动成功,但是就是网页上无法访问

查看jenkins的日志
docker logs -f jenkins_study

image

https://yq.aliyun.com/article...

Docker私服

docker pull registry
> docker run -d \
 -p 5000:5000 \
 -v /usr/local/registry:/var/lib/registry \
 --restart=always \
 --name registry \
 registry:latest

将镜像推到私服

将主机的registry镜像命名为符合仓库要求registry_url:port/ImageName:tag的格式:

docker tag springboot-study-eureka:latest 106.54.121.152:5000/springboot-study-eureka:latest

image

docker push 106.54.121.152:5000/springboot-study-eureka

image

这是因为我们启动的registry服务不是安全可信赖的。这时需要修改客户端docker的配置文件/etc/docker/daemon.json,添加下面的内容(registry服务地址)

{
"registry-mirrors": [ "https://pee6w651.mirror.aliyuncs.com"],"insecure-registries": ["106.54.121.152:5000"]
}

"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"] 是阿里云代理的Registry Hub仓库的地址,可以加快国内访问Registry Hub仓库的速度。

systemctl restart docker重启docker

再次执行push操作,会看到下面结果

image

浏览器访问http://106.54.121.152:5000/v2...

image

Docker 安装nginx

docker pull nginx

sudo docker run --name nginx-test -p 8081:80 -d nginx

在docker中部署nginx

创建如下文件:

mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf

拷贝容器内 Nginx 默认配置文件到本地当前目录下的 conf 目录,容器 ID 可以查看 docker ps 命令输入中的第一列:

sudo docker cp container_id:/etc/nginx/nginx.conf ~/nginx/conf
sudo docker run -d -p 80:80 --name nginx-test-web -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx

Docker 安装consul

docker pull consul

\#期望容器中的配置文件、数据、日志再容器异常关闭或主动删除后保留,则需要配置挂载

\#容器对应配置文件路径都是从https://hub.docker.com/_/consul上对应的官网操作中确认过的

mkdir -p /data/consul/{conf,data}

这条语句无效

docker run --name consul -p 8599:8500 -v /data/consul/conf/:/consul/conf/ -v /data/consul/data/:/consul/data/ -d consul

这条语句可行

docker run --name consul -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0 -client=0.0.0.0
–net=host docker参数, 使得docker容器越过了netnamespace的隔离,免去手动指定端口映射的步骤
 
-server consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求
 
-advertise 将本机私有IP传递到consul
 
-bootstrap-expect 指定consul将等待几个节点连通,成为一个完整的集群
 
-retry-join 指定要加入的consul节点地址,失败会重试, 可多次指定不同的地址
 
-client consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
 
-bind 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
 
-allow_stale 设置为true, 表明可以从consul集群的任一server节点获取dns信息, false则表明每次请求都会经过consul server leader
 
--name DOCKER容器的名称
 
-client 0.0.0.0 表示任何地址可以访问。
 
-ui  提供图形化的界面。

Docker 安装ScyllaDB集群

docker run --name scylla-node2 -p 8042:9042 -p 8160:9160 -p 1000:10000 -p 8180:9180 -v /data/scylladb2:/var/lib/scylla -d scylladb/scylla --seeds="$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' scylla)"

docker run --name scylla-node3 -p 10042:9042 -p 10160:9160 -p 1100:10000 -p 10180:9180 -v /data/scylladb3:/var/lib/scylla -d scylladb/scylla --seeds="$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' scylla)"

docker run --name scylla-node4 -p 11042:9042 -p 11160:9160 -p 1200:10000 -p 11180:9180 -v /data/scylladb4:/var/lib/scylla -d scylladb/scylla --seeds="$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' scylla)"

花花呀
363 声望21 粉丝

学无止境 做有灵魂的程序员