【docker】环境和代码打包到其他服务器上_docker打包镜像到本地 传到其他服务器
文章目录
把容器打包为镜像再迁移到其他服务器
【没整理好】
docker使用
docker run --name
,也可以添加参数-d
表示后台运行。
docker stop
停止容器
docker rm
删除容器
docker ps
查看运行时容器列表
docker ps -a
查看所有容器列表
最朴实的打包方式
我想拉一个ubuntu:latest的镜像,容器化后把我代码和环境配好,最后再转为镜像。
拉取镜像:
因为服务器没网,所以我在自己电脑上pull了ubuntu:latest镜像,然后保存导入到服务器上。
拉取镜像:docker pull ubuntu:latest
把本地镜像保存为一个文件:docker save > image.tar
把文件传到服务器后导入镜像:docker load < image.tar
,然后会返回镜像的ID。
查看本地镜像:docker images
最新的:就是刚刚导入的镜像,可以改名:docker tag ubuntu:latest
新建和运行容器:
新建:docker run -it --name test ubuntu:latest /bin/bash
-it
中i是指交互,t是分配一个伪终端,/bin/bash
使得容器保持运行。
如果已经新建好了,就docker exec -it test bash
复制宿主机文件到docker内部:docker cp :
然后更新和安装一些东西:
apt-get updateapt-get install -y vim curl wget iputils-ping net-tools unzipcurl -LsSf https://astral.sh/uv/install.sh | sh # 安装uv
shell配置文件.bashrc
在/root目录下
普通用户在/home/用户名目录下
打包镜像
官方dockerfile
如何将自己的环境和代码打包成docker镜像
docker打包项目
通过dockerfile打包镜像
docker build -t 镜像名称:镜像标签 . -f
.
代表当前目录,可以修改。
镜像标签的意义是标识镜像的版本。
dockerfile写法:
FROM指定基于哪个镜像来构建, 如FROM xxxx
EXPOSE指定镜像内服务对外提供的端口号,如EXPOSE 8080
WORKDIR设定镜像的工作目录,后面的命令都基于这个目录,如WORKDIR /app
COPY可以从宿主机目录复制文件到容器内的指定目录,如COPY . /app
CMD设置容器启动后默认执行的命令,中括号数组形式,和vscode的launch.json的args写法类似。
ENV设置环境变量
注意点!
- 不要在Dockfile里做mv操作!mv操作会添加镜像大小。
- 不要单独RUN chown COPY过来的文件。COPY操作的时候直接chown会更好。参考
示例:
FROM ubuntu:latestRUN apt-get updateRUN apt-get install -y vim curl wget iputils-ping net-tools unzip xz-utils libaio1t64 libnuma-devRUN ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1# 设置工作目录 用户ubuntu目录下 设置用户权限USER ubuntuWORKDIR /home/ubuntuRUN chown -R ubuntu /home/ubuntuRUN mkdir packages# 复制数据COPY packages /home/ubuntu/packages# 安装软件的目录RUN mkdir programs# 安装neo4j (安装java) ########################################RUN tar -zxf packages/neo4j/jdk-17_linux-x64_bin.tar.gz -C programsENV JAVA_HOME=/home/ubuntu/programs/jdk-17.0.7ENV CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOMERUN tar -zxf packages/neo4j/neo4j-community-5.22.0-unix.tar.gz -C programsENV NEO4J_HOME=/home/ubuntu/programs/neo4j-community-5.22.0ENV PATH=$JAVA_HOME/bin:$NEO4J_HOME/bin:$PATHRUN cp packages/neo4j/apoc-5.22.0-core.jar $NEO4J_HOME/plugins/apoc-5.22.0-core.jar# 加载数据RUN neo4j-admin database load --from-path packages/neo4j/backup_complex neo4j2# 修改conf文件,切换数据库+配置插件RUN sed -i \'1i initial.dbms.default_database=neo4j2\' $NEO4J_HOME/conf/neo4j.confRUN sed -i \'1i dbms.security.procedures.unrestricted=apoc.*,algo.*\' $NEO4J_HOME/conf/neo4j.conf# 安装elasticsearch ########################################RUN tar -zxf packages/elasticsearch/elasticsearch-8.17.3-linux-x86_64.tar.gz -C programsENV ES_HOME=/home/ubuntu/programs/elasticsearch-8.17.3ENV PATH=$ES_HOME/bin:$PATH# 配置ES内部的jdkRUN sed -i \'1a export JAVA_HOME=$ES_HOME/jdk\' $ES_HOME/bin/elasticsearchRUN sed -i \'2a export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar\' $ES_HOME/bin/elasticsearchRUN sed -i \'3a export PATH=$JAVA_HOME/bin:$PATH\' $ES_HOME/bin/elasticsearch# 安装分词器RUN unzip packages/elasticsearch/elasticsearch-analysis-ik-8.17.3.zip -d $ES_HOME/plugins/ik# 安装mysql ########################################RUN tar -xf packages/mysql/mysql-8.4.5-linux-glibc2.28-x86_64.tar.xz -C programsENV MYSQL_HOME=/home/ubuntu/programs/mysql-8.4.5-linux-glibc2.28-x86_64ENV PATH=$MYSQL_HOME/bin:$PATHRUN cp packages/mysql/my.cnf $MYSQL_HOME/my.cnfRUN mysqld --defaults-file=$MYSQL_HOME/my.cnf --initialize-insecure --user=ubuntu# 安装UVRUN mkdir cacheRUN curl -LsSf https://astral.sh/uv/install.sh | shENV UV_CACHE_DIR=/home/ubuntu/cache/uv/downloadENV UV_PYTHON_INSTALL_DIR=/home/ubuntu/cache/uv/installENV UV_LINK_MODE=hardlinkENV PATH=/home/ubuntu/.local/bin/:$PATHRUN mkdir projectRUN cp -r packages/military project/militaryRUN cp -r packages/resources project/resourcesRUN mkdir project/modelsWORKDIR /home/ubuntu/project/militaryRUN uv venv --python=python3.11.7RUN uv syncRUN uv pip install lotus-aiRUN uv pip install urllib3==1.25.11RUN . .venv/bin/activateENV PATH=/home/ubuntu/project/military/.venv/bin:$PATHUSER root
把运行时容器打包为镜像:commit
把一个运行中的容器的当前状态打包为一个镜像:commit命令
docker commit 镜像名称:镜像标签
容器和宿主机交互
文件挂载
参数-v :
注意-v
参数要在镜像前面。
参考:
docker run -it --name test3 -v /data1/ztshao/pretrained_models:/home/ubuntu/programs military:v3 /bin/bash
容器内部访问宿主机API
端口映射
参考1
参考2
参考3
比如访问ollama接口,本来是http://localhost:11434/v1
第一步,确认宿主机ip
首先,查找宿主机在 Docker 网络中的 IP 地址。可以在外部操作docker network inspect bridge
,查找里面的IPAM->Config->Gateway字段。
简单测试,比如我的宿主机ip是172.17.0.1
docker容器上测试能否访问宿主机:ping 172.17.0.1
宿主机上的ollama测试:curl http://localhost:11434
docker容器上的ollama测试:curl http://172.17.0.1:11434
第二步,确认宿主机监听端口
查看宿主机ollama监听端口ipnetstat -tlnp | grep 11434
,输出结果:
tcp6 0 127.0.0.1:11434 :::* LISTEN 3864287/ollama
可以发现监听ip是127.0.0.1,但是docker链接的宿主机ip是172.17.0.1,所以要把监听ip改成0.0.0.0,(127.0.0.1是个环回地址,是IP,并不表示“本机”,0.0.0.0才是真正表示网路中的本地)
因此需要修改ip。
官方有ollama作为systemd service运行的ip修改做法
但是因为我ollama不是作为systemd service运行,所以可以直接添加环境变量:export OLLAMA_HOST=0.0.0.0:11434
即可。
然后就可以正常测试了:curl http://172.17.0.1:11434
同理
neo4j:
修改安装目录的conf/neo4j.conf
,添加监听地址dbms.default_listen_address=0.0.0.0
elasticsearch:
在安装目录的config/elasticsearch.yml
中添加配置http.host:0.0.0.0
mysql:
在安装目录的my.cnf
的[mysqld]
中添加配置bind-address=0.0.0.0
此外,由于mysql有用户限制,处理更麻烦一点,参考。
mysql -uroot use mysql;select user, host from mysql;update user set host = \'%\' where user = \'root\';
litellm
如果要访问ollama接口,要配置环境变量OLLAMA_API_BASE=http://172.17.0.1:11434
可能的问题
不能显示中文
比如sql新建table不能加中文
https://loesspie.com/2018/03/15/docker-chinese-error/
https://blog.csdn.net/weixin_44455388/article/details/109092222
解决1(dockerfile):
dockerfile里加一行ENV LANG C.UTF-8
解决2(命令行):
export LANG=C.utf8export LC_ALL=C.utf8