VMware介绍
Docker是一个开源应用容器引擎,类似于虚拟机,Go语言编写。可以打包应用依赖到一个可移植的容器中。
可以利用 Docker 的方法来快速交付,测试和部署代码。
Centos Linux安装Docker
直接:
1 | yum -y install docker-io |
或者:
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装依赖 |
在编辑好的yml目录中执行启动关闭项目
1 | docker-compose up |
镜像加速
1 | https://cr.console.aliyun.com # 注册阿里云,选择镜像中心,镜像加速 |
可以写一个脚本docker-install.sh,下面内容就够
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
卸载重新安装
1 | 卸载 |
错误
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running
Docker未启动,执行命令:service docker start
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-3cf202aa8f9b -j RETURN: iptables: No chain/target/match by that name.
关闭防火墙需要重启docker,执行命令:service docker restart
tcp 47.107.215.73:443: i/o timeout
可能原因:网络不通,url地址拼写错误
Error parsing reference: "python:alpine AS base" is not a valid repository/tag: invalid reference format
版本兼容问题:升级docker版本
Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]
升级docker-maven-plugin到1.0.0版本。docker开启远程API端口
1 | vi /etc/sysconfig/docker |
在windows系统环境变量中新建DOCKER_HOST值为tcp://{docker_ip}:2375,将这里的{docker_ip},替换为docker所在的centos服务器IP或主机名.
1 | vi /usr/lib/systemd/system/docker.service |
解决 docker 报错: Error starting daemon: error initializing graphdriver: backing file system is unsupported for this graph driverjournalctl -xe
查询错误信息,dockerd
命令。
所以尝试修改 /etc/sysconfig/docker-storage 为:
DOCKER_STORAGE_OPTIONS=”–storage-driver btrfs “
systemctl start docker 重启解决问题
docker的安装目录
1 | docker info | grep "Docker Root Dir" |
数据Volume
volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中。在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts,tmpfs(一般不用)
1 | docker volume create test-nginx-vol # 创建 |
进入containers目录,每一个序列号,都是一个镜像
常用命令
docker ps
查看启动的容器docker exec -it id(name) /bin/bash
进入容器,如果出错用把/bin/bash
改成/bin/sh
docker rmi 镜像id
删除镜像
文件拷贝到容器与拷贝出容器
1 | docker cp mysql:/home/test/abc.txt ./ # 拷贝出来 |
让容器执行命令
可以把脚本文件拷贝到容器,然后通过这个命令执行脚本
1 | docker exec -it 容器名/容器ID bash # 进入容器执行 |
获取常用镜像并使用的例子
不对容器进行删除操作,数据也是不会丢失的。-v
做目录映射的时候要检查下宿主机目录下的文件是否正常,如果文件是有问题的会导致启动容器使用宿主机的错误文件启动,导致程序出错。
自己安装的mysql,如果对目录进行了映射,就得把安装好的正常的目录拷贝一个到宿主机中,否则启动会出错。
查看容器日志docker logs mysql
1 | 下载镜像 |
制作镜像:
docker commit centos76 xxxx:1.0
倒出镜像:
docker export xxxx:1.0 > xxx_server.tar
导入镜像
docker import - new_xxx_server < xxx_server.tar # 横线也要有
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
docker images # 查看镜像
save load 也行信息更完整: docker save xxxxx:1.0 > xxxx_server.tar
问题解决
1 | error: Failed dependencies: |
docker安装MySQL
数据库不适合部署在docker中。
- 拉取官方镜像(使用5.7版本)
1
2docker pull mysql:5.7 # 拉取5.7版本,我们使用5.7版本,容器内目录/var/lib/mysql
docker pull mysql # 拉取最新版本 - 查看镜像
1
sudo docker images
- 启动方式一,不建立目录映射
1
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
- -name:容器名
- -e:配置信息
- -p:端口映射, 主机端口:容器端口
- 启动方式二,建立目录映射,制作安装脚本的时候映射的目录不要使用安装包的目录避免被误删
1
2
3
4
5
6sudo 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=root \
-d mysql:5.7- -v: 主机目录:容器目录
- 查看docker进程
1
docker ps
- 重启mysql,删除容器,启动出错,重复启动用得上
1
2docker restart mysql
docker rm ba7ef3e4ba975474b67c0f9126f07a4d88140e569323a77800aab8624361d67d # 谨慎使用会丢失容器数据 - 进入docker
1
2sudo docker exec -it mysql bash
mysql -uroot -proot - 查看或者设置外部访问权限
1
2
3
4
5
6
7
8
9
10
11
12
13use mysql;
grant all privileges on *.* to root@'%' identified by "root"; # 授权访问
flush privileges;
select host,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
4 rows in set (0.00 sec) - 通过win Navicat等工具尝试访问
问题
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
可能是脚本语句按顺序执行,但是mysql服务还没完全初始化成功。所以可以sleep 10 休息10秒钟可能就可以连接上了。
docker安装redis
1 | docker run -itd --name redis-test -p 6379:6379 redis # 第一次启动 |
cli
1 | redis-cli |
docker安装ElasticSearch
问题修复
org.elasticsearch.indices.recovery.RecoveryFailedException...Recovery failed from...
简单修复:删除data目录与logs目录
java docker配置
- POM文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>info-tech</imageName>
<dockerDirectory>${project.basedir}</dockerDirectory><!--Dockerfile文件存放路径-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!-- 运行命令 mvn clean package docker:build 打包并生成docker镜像 -->
</plugin>
</plugins>
</build> - 在工程创建Dockerfile,与pom文件同级
1
2
3
4
5
6
7
8
9
10
11
12
13FROM java:8
EXPOSE 8080
VOLUME /tmp
ADD info-tech.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
参数说明
EXPOSE 指令用于指定容器将要监听的端口,需要配合 docker run -p PORT:EXPORT使用
RUN 每条RUN指定将在当前镜像基础上执行指定命令,并提交为新的镜像,通过&&可以把多条语句合并成一条
VOLUME 指定默认卷,会在volume目录下面生成随机码文件夹与之对应。然也可以指定/tmp 其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径
ADD 相当于COPY文件到容器中,info-tech.jar是java工程包的名字不是镜像名字
ENTRYPOINT 启动的时候默认执行的命令 - 在开发环境增加环境变量
DOCKER_HOST=tcp://localhost:2375
连接到目标Docker主机 - 开发环境执行
mvn clean package docker:build
打包到docker服务器 - 到docker服务器,启动
1
docker run -itd --name info-tech -p 8080:8080 info-tech:latest # --name 指定一个名称
- 制作成镜像分享
1
2
3docker save -o info-tech.tar info-tech # 镜像打包输出到当前目录
docker load < /xxx/xx/info-tech.tar # 上传到其他服务器,加载镜像
docker images # 查看镜像、之后后面可以允许镜像
IDEA打包就行执行最上级工程中的→Lifecycle→package或者install。POM文件需要增加下面的maven插件配置。
还可以java打包成jar包上传至Docker服务器,在Docker服务器创建Dockerfile编写类似上面的脚本。执行 docker build -t info-tech .
然后运行容器docker run -d --name info-tech -p 8083:8083 info-tech
1 | <build> |
如果启动失败docker run -it info-tech
可以看到错误信息docker rm -f container-id
强制移除进程 docker rmi image-id
docker内不能通过127.0.0.1访问主机的其他服务
根据容器名称启动之前启动过的容器 docker start info-tech
启动的容器可以统一命名成增加-run
后缀比如info-tech-run
docker安装postgres
1 | docker run \ |
docker安装vsftpd
1 | docker pull fauria/vsftpd |
进入容器添加账号的脚本,执行脚本的方法:
1 | docker exec -i -t vsftpd bash |
海外阿里云上传,如果使用XShell的XFTP是走加密的上传速度是289KB/s,后面安装Docker FTP是420KB/s,之后再用SFTP结果速度也提高到了420KB/s 使用加密的SFTP容易断线。有点奇怪,当然没加密肯定是会快一些的,速度非常低的时候提现不出来。
docker安装nginx
建立nginx-install.sh
1 | docker pull nginx |
docker安装redis
建立redis-install.sh
1 | docker pull redis:latest |
docker安装mysql
建立mysql-install.sh
1 | docker pull mysql:8.0 |
Docker制作镜像
正常用法是一个docker一个前端进程。
创建Dockerfile 内容:
1 | FROM centos:7 |
执行docker build -t tomcat3 .
制作镜像
执行docker run --name tomcat3 -d tomcat3
启动
制作后台启动多个服务:
创建start.sh。 使用systemctl用不了,无法自动启动。
1 | !/bin/bash |
创建tomcat-test1.service
1 | [Unit] |
创建Dockerfile
1 | FROM centos:7 |
systemctl认不到环境变量,tomcat中的setclass.sh头部需要添加,可以ADD进去或者tomcat压缩包直接改好,或者通过命令修改文件,或者给好后ADD进去:
export JAVA_HOME=/usr/java/jdk1.8.0_202
export JRE_HOME=/usr/java/jdk1.8.0_202/jre
启动:
使用docker run --name tomcat3 --privileged=true -d tomcat3
docker run --name tomcat3 --privileged=true -d tomcat3 /usr/sbin/init
使用/usr/sbin/init会导致无法自动调用启动脚本执行启动命令,支持在内部使用systemctl启动程序。
升级,可以通过脚本直接替换完整镜像。对于数据库升级可以读取docker中当前使用的镜像版本号与目标版本进行执行增量脚本,也可以人工一个个执行。
网络
默认桥接模式,启动的时候通过在宿主机上,可以通过iptables -t nat -L -n,查到一条DNAT规则:
DNAT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:8083 to:172.17.0.5:8083
打包
可以通过脚本从公网下载镜像包,进行运行
也可以直接制作好可以执行的镜像包运行
也可以镜像包加外部配置文件映射组合
可以基础组件与程序分离,也可以AllInOne
通过python修改配置文件
1 | import yaml |
其他
查看docker占用内存
命令docker stats
,docker ps -a
找到容器id ps -ef|grep 容器id
找到进程id top -p 进程id
,或者cat /proc/pid/status
里面的VmRSS
问题
用户使用docker ps 权限问题
执行sudo chmod a+rw /var/run/docker.sock
命令
最容易出现的问题就是忘记关防火墙或者开放端口
【docker】iptables failed: iptables –wait -t nat -A DOCKER -p tcp -d 0/0 –dport 8888 -j DNAT –to-d
解决方法:systemctl restart docker
standard_init_linux.go:228: exec user process caused: exec format error
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec format error: unknown
sh文件第一行加入 #!/bin/bash
执行脚本以后哪几种
有第一次启动才执行的初始化脚本。
有每次启动都执行的启动脚本。 如果restart每次都会调用修改配置的脚本,那么脚本就不能用替换的方法(第二次重启的时候实际上第一次已经替换过了,当然替换过来也会导致第二次替换不成功,实际可能也不会出什么问题,还是得比较慎重),就应该直接用yml写入的方法实现。重启想换参数,如果是用替换模式,由于已经被替换一次也会出现下一次无法被替换的情况。当然考虑需要修改配置参数进行重启的情况也比较少,可以根据具体情况考虑是否需要换种修改配置的模式。
后台运行
Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台
当然可以run命令增加权限支持后台运行:--privileged=true
/usr/sbin/init
例子:docker run --name tomcat3 --privileged=true -d tomcat3 /usr/sbin/init
,docker run -d -it --privileged nginx-1 /usr/sbin/init
启动失败
制作的镜像启动失败,通过命令查看启动失败日志docker logs tomcat
实战需要考虑的
制作一键容器制作脚本
制作一键容器启动脚本
制作升级脚本
对于应用升级一般直接替换Docker镜像
简单应用:
- 简单使用就是安装Docker程序,Docker里面程序使用我们正常程序的一键安装包来安装,把权限与缺少的依赖补上运行使用systemctl
- 然后把需要对外的端口expose出来
- 然后把数据、配置、日志等目录映射到主机
- 制作一个Dockerfile脚本与维护手册
- 好处是程序安装脚本实体机与Docker可以共用
- 程序需要升级也是进入docker执行升级脚本(这样程序也得映射出来,可以把/home/xxx 或者/usr/local等程序目录直接映射到本机,当然也可以通过命令保存所做的更改) 好处是一个镜像可以无限升级使用,或者用新docker镜像替代旧Docker镜像,然后执行增量脚本,如果用镜像模式对于数据库还得做判断当前是哪个版本需要执行哪些脚本。
- 不一定都用自动化脚本,也可以通过教程的方式,通过命令来构建工程镜像运行
比较复杂的就是各个应用程序单独一个镜像,维护成本比较高,各自有各自的优缺点。
总结
ftp与使用ftp里面文件的应用可以使用不同的容器,然后都-v映射到主机上同一个目录下面,应用容器使用Apache提供的目录文件变化监听器来监听修改移动文件。是可行的。
参考
- docker搭建rabbitMQ集群
- Install Docker Engine on CentOS
- 你必须知道的Docker数据卷(Volume)
- Docker run 命令
- 六种减小Docker镜像大小的方法
- Docker容器跨主机通信之:直接路由方式
- centos7安装docker,docker安装纯净centos7.6镜像 容器内安装python3.7 提交新镜像
- docker 数据映射方案
- Dockerfile的使用以及docker部署java项目
- docker搭建nginx + tomcat负载均衡(这种都放在宿主机使用docker的意义是?)
- docker部署Javaweb项目(jdk+tomcat+mysql)
- Docker部署java项目[tomcat环境]
- 使用Docker部署JavaWeb项目
- 通过Docker部署Java项目的日志输出到宿主机指定目录
- k8s部署mysql数据持久化
- Docker构建Nginx+Tomcat镜像(实现动静分离)
- Docker 通过Dockerfile在centOs基础镜像上搭建java8环境
- Docker 安装及配置镜像加速的实现
- docker ftp配置多个用户
- docker-vsftpd有Dockerfile与脚本,使用说明与文档
- docker部署nginx
- docker上启动nginx,并配置修改nginx的配置文件
- Docker 安装 Nginx 并个性化挂载配置文件 nginx.conf
- 【Docker】:使用docker安装redis,挂载外部配置和数据
- docker安装mysql、redis并映射到本地
- docker 安装redis
- docker hub mysql
- docker mysql初始化多个sql脚本
- docker入门(centos7.2安装docker并使用Dockerfile做一个自己的tomcat镜像)
- Dockerfile rpm安装jdk设置环境变量 问题
- Docker容器使用问题:Failed to get D-Bus connection: Operation not permitted
- docker搭建nginx + tomcat负载均衡
- 为什么需要Docker?
- JAVA项目如何通过Docker实现持续部署
- docker 部署mysql服务之后,执行sql脚本
- Dockerfiler如何使用多个启动命令entrypoint
- docker start 默认后台运行吗_Docker使用指南
- 关于对docker run –link的理解
- Docker容器互访三种方式
- docker部署项目通过127.0.0.1访问数据库:Connection refused
- shell动态修改yml配置文件
- Python获取命令行参数的正确方法,案例详解
- python获取命令行参数的方法(汇总)
- Dockerfile中CMD的用法
- Linux python2.7 安装pip
- linux Python2.7 离线安装pip、numpy、scipy、sklearn等
- linux yum升级python,Centos 升级python版本(yum 安装方式)
- TypeError: an integer is required (got type str)
- PYTHON3安装PYYAML
- 如何修改正在运行的docker镜像的端口映射?
- 在Docker上开发你的应用程序
- docker exec执行多个命令详解
- docker如何部署oracle数据库
- 搭建CentOS7.6容器镜像
- 怎么给运行中的docker容器添加新的端口
- docker镜像的导入导出
- mysql容器保存为镜像实战操作(拷贝方法)
- Docker下安装mysql超详细步骤
- docker 给已经启动的容器添加目录映射(挂载目录)
- docker安装mysql容器创建成功但无法启动问题