本地配置虚拟机docker开发环境

1.开启ubuntu ssh服务

sudo apt-get install openssh-server
sudo /etc/init.d/ssh start 

远程ssh登陆服务器

2. docker安装

#yum包更新到最新
sudo yum update
#安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装docker 由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
$ sudo yum install docker-ce
#启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docke
#验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version

如果虚拟机是ubuntu的可以按这种方法安装:ubuntu安装docker

- docker hello-world报错

[vagrant@docker ~]# docker pull hello-world
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

修改docker镜像源,docker默认的源为国外官方源,下载速度较慢,可改为国内

进入/etc/docker,查看有没有daemon.json。这是docker默认的配置文件。如果没有新建,如果有,则修改。

[vagrant@docker ~]# vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}

顺便回顾了vim指令,进入后是命令模式,输入i进入编辑模式进行输入。ESC退出,输入:进入末行模式,q!强制退出,wq保存后退出。
删除所有行,命令模式下输入dG

拉mysql镜像的时候还是拉不到,timeout错误,还是要改镜像源,继续进入daemon.json,改为:

{
	"registry-mirrors": ["https://mirror.ccs.tencentyun.com", "http://hub-mirror.c.163.com"]
}

3. docker mysql安装

还有安装Java:sudo docker pull mysql:5.7

sudo docker pull mysql:5.7

sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 --restart=always mysql:5.7

-d 是后台运行,守护进程,同 --detach
-name Assign a name to the container,自定义容器名称
-p 指定端口,前面是映射端口,后面是容器运行的端口,同 --publish
-e 设置环境变量,同 --env
–restart 设置容器开机运行

进入Mysql容器
docker exec -it mysql bash
登陆,设置默认utf-8
mysql -uroot -proot  --default-character-set=utf8
看数据库
show databases

然后通过Navicat 连接,成功!

通常要把mysql的文件夹映射到外面宿主机,以方便查看和备份。

# 假设在宿主机中数据存放路径为/opt/mysql/data,配置文件路径为:/opt/mysql/my.cnfdocker run --name=mysql -itd -p 3308:3306 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25

-it 标准输入输出有关
-d 后台启动
-v 文件映射

 # 将宿主机的路径,映射到容器内部。这个路径既可以是文件夹,也可以是文件
-v hostPath:containerPath

-e 设置环境变量到容器中
  可能会问为什么要映射/etc/timezone和/etc/timezone,这是为了让容器的时间和时区与宿主机保持一致。默认情况下容器为 UTC 标准时间。/etc/timezone让容器时间,时区和宿主机一致。但是如果不映射/etc/timezonejava 应用中的时区还是错的,虽然使用date -R命令查看时间和时区都正常。

- docker装minIO

下载MinIO的Docker镜像:
docker pull minio/minio

在Docker容器中运行MinIO,这里我们将MiniIO的数据和配置文件夹挂在到宿主机上:
docker run -p 9090:9000 --name minio  -v /mydata/minio/data:/data  -v /mydata/minio/config:/root/.minio -v /etc/localtime:/etc/localtime:ro -d minio/minio server /data -console-address ":9000" --address ":9090"

docker run -p 9090:9000 --name minio \ 
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-v /mydata/minio/data:/data \ 
-v /mydata/minio/config:/root/.minio \ 
-e TZ=Asia/Shanghai \
-v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime \
-d minio/minio server /data -console-address ":9000" --address ":9090"

docker container update --restart=always /minio
  # minio默认启动是动态端口,设置固定端口 不然浏览器无法访问
  
   # 登录的用户名
  -e "MINIO_ACCESS_KEY=minio" 
  # 登录的密码
  -e "MINIO_SECRET_KEY=minio123" 

运行成功后,访问该地址来登录并使用MinIO,默认Access Key和Secret都是minioadmin:http://192.168.6.132:9090

- minIO踩坑记录

windows通过控制台能链接上虚拟机的Minio,但Java程序却不行,错误信息:Access denied
网上查说有一种情况,由于本地服务和linux服务器上的时间对不上,或者差距太大。
我看了下服务器,是洛杉矶的时区,登上去改了时间,还是不行。
看到服务器上minio返回的信息:
在这里插入图片描述
时间还是不对的,忽然想到可能是docker容器里的时间和宿主机的时间不同步造成的。又在网上找了宿主机和容器时间同步的方法,最后时间一致了还没解决。

又继续在网上找,发现有人说docker pull的minio镜像是latest最新版本,而minio中文网教程里的对应的Pom版本是7.1.0的,而英文教程里则对应8.3.0。我改了8.3.0发现没有,又试着把本来的7版本改成8版本,启动后上传文件竟然可以了。原来如此,docker上的新版,本地SDK也要用较新的版本,不然莫名其妙报出403和Access denied的错误。

        <!--MinIO JAVA SDK-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.1.0</version>
        </dependency>

新版MinIO控制台和API的访问端口是分开的,前者9000,后者9090.
原来都是共同使用9000,现在需要在启动命令中映射两个端口,然后指定哪个端口做哪项服务。启动命令如下:

#新的启动方式
docker run -p 9000:9000,8000:8000  minio server --address '0.0.0.0:9000'  --console-address '0.0.0.0:8000'  /data

除此之外,最近版本的minio不再使用MINIO_ACCESS_KEY and MINIO_SECRET_KEY 指定账号密码,改成MINIO_ROOT_USER and MINIO_ROOT_PASSWORD了。
参考:
http://www.04007.cn/article/1041.html

- docker装NGINX

docker pull nginx:1.10
#先运行一次容器(为了拷贝配置文件):
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-d nginx:1.10
#将容器内的配置文件拷贝到指定目录:
docker container cp nginx:/etc/nginx /mydata/nginx/
#修改文件名称(进到/mydata/nginx目录):
mv nginx conf
#终止并删除容器:
docker stop nginx
docker rm nginx
#使用docker命令启动
docker run -p 80:80 -p 443:443 --name nginx \
-d --restart=always \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10

在conf中的conf.d目录创建home.conf:

server {
    listen       80;
    server_name  mashangit.com;

    #静态代理
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    #api动态代理
    location /api/ {
    	proxy_pass   http://47.107.238.11:8080; #修改为代理服务地址
        index  index.html index.htm;
    }
}

若有ssl的则加入:

server {
    listen       443 ssl;
    server_name  ctoc-app.genscigroup.com;

    #ssl on;
    ssl_certificate         /ssl_certs/_.sinoeyes.com_bundle.crt;
    ssl_certificate_key     /ssl_certs/sinoeyes.com_RSA.sinoeyes.com_RSA.key;
    ssl_session_timeout 5m;
    ssl_ciphers  AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    location / {
         proxy_pass https://ctoc.genscigroup.com:30081/;
    }

    location /mobile-gensci-appeal/filesystem/ {
         proxy_pass  https://ctoc.genscigroup.com:30081/filesystem/;
    }

    location /mobile-gensci-appeal/ {
         proxy_pass http://ctoc-app.genscigroup.com:30082/mobile-gensci-appeal/;
    }
}

更新配置后记得reload:

docker exec  nginx bash -c 'nginx -s reload'

注意:linux命令mv既是重命名又是移动。比如mv nginx conf,如果有后面的conf存在,则将前面的nginx 移动到conf中,否则才把nginx重命名为conf。

4. 通过IDEA远程打包镜像和上传到开发机docker

通过IDEA的docker-maven-plugin插件实现。首先要开启开发机的2357端口,用于docker的链接。(生产服务器需要限制ip,不然会被挖矿)。
限制ip的方法:2357端口限制Ip链接
第一种(我试了无效):

sudo vim /etc/default/docker
加入:
DOCKER_OPTS="-H tcp://0.0.0.0:2375"
重启:
sudo systemctl restart docker

第二种:

编辑文件:
vim /lib/systemd/system/docker.service                               
 # 有的路径是: /usr/lib/systemd/system/docker.service
 修改ExecStart行为下面内容:
 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 
 重启:
  sudo systemctl daemon-reload
  sudo systemctl restart docker

另再补几个vi的操作:

删除当前字符
命令模式x
删除当前行命令模式dd
后插入a,前插入i
插入一样o
查看2376端口是否已经成功试用
sudo netstat -tunlp

docker-maven-plugin插件的pom设置:

 <!--docker的maven插件-->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.1.0</version>
            <!--配置部分-->
            <!-- 绑定docker命令到 maven各个阶段 -->
            <!-- 解释:可以把 docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 阶段 -->
            <executions>
                <execution>
                    <id>build-image</id>
                    <!-- 这里将插件绑定在package这个操作上。用户只需执行mvn package ,就会自动执行mvn docker:build  相当于执行了mvn clean package docker:build -->
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,我们要直接传到私服-->
                <!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本-->
                <imageName>${project.artifactId}:${project.version}</imageName>
                <!-- build时,指定–rm=true即build完成后删除中间容器 -->
                <rm>true</rm>
                <!--基础镜像,相当于Dockerfile里的from-->
                <baseImage>ascdc/jdk8</baseImage>
                <!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,testDocker-->
                <!--相当于启动容器后,会自动执行java-jar/testDocker.jar-->
                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <!--把哪个文件上传到docker,相当于Dockerfile里的add testDocker.jar /-->
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
                <dockerHost>http://你宿主机的ip:你docker开放的port</dockerHost>
            </configuration>
        </plugin>

5. docker java启动后调不通

容器中java服务启动的时候没有指定对应的beta环境,导致没有读到正确ip的数据库。
在pom的docker-maven-plugin中加入

 <entryPoint>["java", "-jar","-Dspring.profiles.active=beta","/${project.build.finalName}.jar"]
 </entryPoint>

指定启动beta环境,同时在beta的profile里把mysql的链接ip设为开发机的。
另外还有两个问题,再次用docker-maven-plugin打包时不会自动覆盖和删除之前打包的镜像,上传镜像之后不会自动启动容器,还要手动输入命令起容器。

sudo docker run -itd --name mall -p 8080:8080 mall-tiny/mall-tiny:1.0.0-SNAPSHOT

IDEA链接docker查看信息

参考文献:
https://www.cnblogs.com/jpfss/p/10945324.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值