docker学习笔记(其二)
2024-01-23
接着上次的《docker学习笔记》,今天记录下docker使用的更多细节。包括docker拷贝宿主机文件到容器里面、docker在线镜像查找、mysql的配置和使用等。
首先是比较重要的文件拷贝,因为docker最终还是要部署代码的,需要把文件拷贝到docker容器里面使用,这时候需要用到docker cp 文件或者文件夹 容器名称或者id:/目的路径。比如我的容器叫mytest_docker,需要把本地test文件夹拷贝到容器里的/var/www下面,命令如下:
docker cp ./test mytest_docker:/var/www然后是mysql镜像的使用。数据库我这里强烈建议单独买个数据库服务,国内阿里和腾讯的RDS海外的AWS数据库服务都挺不错的,数据不容易丢失也好扩展,对负载均衡也友好。但是架不住有些情况非要把数据库搞到docker容器里面,这种方式我建议把数据库文件映射到宿主机上或者定时做数据备份避免数据丢失。命令如下:
#查看hub.docker.com上的mysql docker镜像(连接不上的话可能需要自己想想办法科学上网)docker search mysql#最新版本应该是8点多,这里我选的是mysql5.7.34,映射到宿主机的端口是33068(只是为了宿主机好管理容器里的数据库,正式环境也可以不要映射)docker pull mysql:5.7.34docker run --name=自定义的容器名字 -e MYSQL_ROOT_PASSWORD=你想设置的数据库密码 -d -p 33068:3306 mysql:5.7.34#然后是导入数据库文件,不另外设置网关的情况下默认可以通过127.0.0.1:33068访问容器里的数据库mysql -h 127.0.0.1 -P 33068 -u root -p你设置的数据库密码 < 要导入的数据库文件.sql#当然也可以把sql文件cp到容器里面,再进到mysql容器里面直接导入docker exec -it 你的mysql容器名或者id bashmysql -uroot -p数据库密码 < 数据库文件.sql没有特殊配置的话容器里的代码直接可以通过docker内网来访问,查看容器内网地址命令如下:
#默认应该是172.17.0.x,可以按实际地址来使用docker inspect 容器名称或者id|grep IPAddress
最近项目要用到docker,回忆了下上次看docker已经是两年前了有生疏。这里记录下学习笔记。
1.docker的安装。
docker主要跑在linux上这里讲下基本CentOS和Ubuntu下的安装。
#ubuntu
sudo apt install docker-ce docker-ce-cli -y#cenos
yum install docker-ce -y2.拉docker镜像。
docker pull 179633571/php72w3.查看镜像并且用拉下来的镜像启动容器.
docker imagesdocker run --name=自定义名字 -it -d -p 外部端口号:容器内端口号 镜像id "/bin/bash"4.查看容器情况。
docker ps -a5.进入容器命令行。
docker exec -it 容器名称或者id "/bin/bash"6.停止和启动容器。
docker stop 容器名称或者iddocker start 容器名称或者id7.删除容器和镜像(删除镜像必须先停掉其关联的容器)。
docker rm 容器名称或者iddocker rmi 镜像id8.导出容器备份文件和导入容器备份文件。
docker export 容器名称或者id > 要备份的文件名称.tardocker import 要导入的容器文件.tar 仓库名:tag(传默认都是空)
wget -O覆盖文件的教训
2024-01-08
最近做了个自动备份线上服务器日志文件下载到本地做备份的功能,思路很简单:定时把日志文件zip -o 备份文件名.zip并且移动到可以下载的目录清掉日志,然后本地环境定时wget -O 备份文件.zip,然后通知线上服务器删除备份文件。
然后就悲剧了,因为事先不知道wget -O在远程文件不存在下载失败的情况下仍然会覆盖文件,第一次下载成功后通知线上删除了文件,然后手动测试第二次的时候由于线上文件找不到了直接下载失败,空文件覆盖了上次下载好的文件。这样一来要备份的文件线上和线下都没有了连个渣都不剩。。。。
后来才知道wget 应该加-N参数,下载前先比对线上和线下文件,如果线上文件没有修改或者不存在才不至于把之前下载好的文件覆盖为空。
谨记教训!