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:///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://","http://"]
}
顺便回顾了vim指令,进入后是命令模式,输入i进入编辑模式进行输入。ESC退出,输入:进入末行模式,q!强制退出,wq保存后退出。
删除所有行,命令模式下输入dG
拉mysql镜像的时候还是拉不到,timeout错误,还是要改镜像源,继续进入daemon.json,改为:
{
"registry-mirrors": ["https://", "http://"]
}
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:///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查看信息