# 卸载原来可能有的docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装yum-utils sudo yum install -y yum-utils # 指定阿里云仓库地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 配置缓存 sudo yum makecache fast # 安装,默认安装最新版(二选一) sudo yum install docker-ce docker-ce-cli containerd.io # 安装,安装指定版本(二选一) yum list docker-ce --showduplicates | sort -r sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli- <VERSION_STRING> containerd.io # 启动 sudo systemctl start docker # 开机自启 sudo systemctl enable docker
sudo yum install docker-ce docker-ce-cli containerd.io
与直接sudo yum install docker
有啥区别?/var/lib
中,docker pull
下载的镜像信息会记录在/var/lib/docker/image/overlay2/repositories.json
文件中这里安装tomcat与部署SpringBoot项目没啥关系,就是玩儿
# 有些容器命令用起来简单,一段时间不用就忘了,这里罗列几个 # 查看所有容器及其详细信息 docker ps -a # 进入容器 docker exec -it 【容器名或容器id】 /bin/bash # 退出容器 exit # 删除容器 docker stop 【容器名或容器id】 docker rm 【容器名或容器id】 # 删除镜像 docker rmi 【容器名或容器id】 # 重启容器,如果修改了挂载目录里的配置文件,可通过docker stop,docker restart来使之生效 docker restart 【容器名或容器id】 # 查看容器启动日志 docker logs 【容器名或容器id】 # 拉tomcat镜像,默认latest docker pull tomcat # 最简单方式运行,-d表示后台运行,两个8080第一个指宿主机的8080端口,第二个8080指容器的8080端口, # 将容器的8080端口映射到宿主机的8080端口上,给容器指定别名tomcat,后面就不用每次都操作容器id docker run -d -p 8080:8080 --name tomcat tomcat # 运行容器后,将需要部署的war包拷贝到webapps目录 # 拷贝方式一,在宿主机上执行docker cp命令 docker cp /usr/local/xxx.war 【容器名或容器id】:/usr/local/tomcat/webapps # 拷贝方式二,在容器内用rz上传,先进入容器 apt update apt install lrzsz rz # 用上述方式运行容器,数据都在容器内,如果容器重启了,那么数据就都丢了,显然不是最好的方式 # 最好的方式是建立容器与宿主机之间的映射,即把容器目录挂载到宿主机上,即使容器重启,只有宿主机上不删除,数据就不会丢 # -v dir1:dir2 就表示容器的目录dir2映射到宿主机的目录dir1上,--restart=always表示docker重启时容器自动重启 docker run -d -p 80:80 --name tomcat -v /root/docker-data/d-tomcat/webapps:/usr/local/tomcat/webapps -v /root/docker-data/d-tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml --restart=always tomcat
经过上述方式启动后,修改/root/docker-data/d-tomcat/conf/server.xml
中的端口为80
,并且加上URIEncoding="UTF-8"
,在/root/docker-data/d-tomcat/webapps/ROOT
下放了一个index.html
,直接通过服务器域名就能访问到。但是,为什么看到的中文是乱码?
POSIX
就通过-e LANG="C.UTF-8"
指定为utf-8
,可我这儿本身就是C.UTF-8
。备份容器
备份到本地
# 备份容器为镜像 docker commit -p 【容器id】 【新镜像名,假设为test-backup】 # docker images即可看到新镜像,导出到本地目录 docker save test-backup > /Users/用户名/Desktop/test-backup.tar # 恢复容器,先删除docker里面的镜像 docker rmi test-backup docker images # 导入 docker load < /Users/用户名/Desktop/test-backup.tar # 再看docker中是否存在 docker images
备份到远程
# 备份容器为镜像 docker commit -p 【容器id】 【新镜像名,假设为test-backup】 # 用户名密码登录docker docker login # 给镜像加tag docker tag test-backup xxx/mytest:test-backup # 保存 docker push xxx/mytest:test-backup # 如果要恢复,在docker pull docker pull ...
# 拉镜像 docker pull mysql:5.7 # 运行容器,指定端口映射,取别名,挂载数据目录,日志目录,配置文件目录,指定密码,自动重启,后台运行 docker run -p 3306:3306 --name mysql -v /root/docker-data/d-mysql/data:/var/lib/mysql -v /root/docker-data/d-mysql/logs:/etc/mysql/logs -v /root/docker-data/d-mysql/conf:/etc/mysql/cnf.d -e MYSQL_ROOT_PASSWORD=123456 --restart=always -d mysql:5.7 # 安装完后,进入容器,进入mysql,密码为123456 # 设置远程登录 use mysql; grant all privileges on *.* to 'root'@'%' with grant option; flush privileges;
123456
,然后我进入容器,把容器内MySQL密码改成了root
,之后容器内执行mysql -u root -p
时必须输root
才能进入MySQL,但是win10的远程连接并没有因为修改了密码而断开,并且,后面部署SpringBoot项目时,项目中连接MySQL需要使用123456
这个初始指定的密码,而不是root
# 拉取镜像 docker pull redis:3.2 # 启动,指定端口映射,别名,指定挂载目录,自动启,指定配置文件启动redis-server docker run -d -p 6379:6379 --name redis -v /root/docker-data/d-redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /root/docker-data/d-redis/data:/data --restart=always redis:3.2 redis-server /usr/local/etc/redis/redis.conf
Dockfile
文件# 基础镜像使用java FROM java:8 # 维护人,作者 MAINTAINER xxx # VOLUME 指定了临时文件目录为/tmp, # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为app.jar ADD express-0.0.1-SNAPSHOT.jar app.jar # 暴露运行端口 EXPOSE 80 # 指定prod环境运行 ENTRYPOINT ["java","-Dspring.profiles.active=prod","-Duser.timezone=GMT+8","-jar","app.jar"]
# 制作镜像,注意后面有个点 docker build -t app . # 注意,因为项目中用到了MySQL以及Redis,这里运行容器时,需要指定MySQL以及Redis,也就是上面部署的MySQL和Redis,. # 上述 MySQL和 Redis在执行docker run命令时,我都指定了别名,分别为mysql、redis,所以这里可以直接用这些别名,docker就会通过别名找到对应容器 # 通过--link参数即可使用容器,比如 --link mysql:conf-mysql,mysql即别名,conf-mysql即我所用的mysql的host,也就是我在application.yaml里面配mysql地址时配的是jdbc:mysql://conf-mysql:3306/【数据库】/xxx docker run --link mysql:conf-mysql --link redis:conf-redis -d -p 80:80 app