!(生产服务器需要运维人员安装,开发人员可忽略1.安装)
该部分运维可根据生产实际情况,进行具体问题补充
sudo yum remove -y docker-ce docker-ce-cli containerd
sudo yum remove -y nvidia-container-runtime* libnvidia-container*
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 移除daemon.json文件
mv /etc/docker/daemon.json /tmp/daemon.json
参考博客:https://blog.csdn.net/feifeiyechuan/article/details/107706062
# 1. 安装可能用到的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 2. 添加docker下载位置
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 3. 查询可以装什么docker版本
yum list docker-ce --showduplicates | sort -r
# 4. 安装指定版本
yum -y install docker-ce-18.06.1.ce-3.el7
# 5. 开启docker服务
systemctl start docker
# 6. 设置开启自启动
systemctl enable docker
# 7. 查看 docker版本
docker version
# 8. 配置国内加速镜像
vim /etc/docker/daemon.json
配置内容:
{
"registry-mirrors": [
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
# 退出并保存
:wq
# 9. 使配置生效
systemctl daemon-reload
# 10. 重启docker
systemctl restart docker
# 安装nvidia-container-runtime,默认安装位置:/usr/bin/
sudo apt-get install nvidia-container-runtime
# 修改 /etc/docker/daemon.json,配置默认nvidia运行
sudo vim /etc/docker/daemon.json
# 在daemon.json文件中添加如下内容,如下示意图
{
"default-runtime": "nvidia"
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
# 重启docker服务即可生效
Sudo systemctl daemon-reload
Sudo systemctl restart docker
参考博客:https://blog.csdn.net/u010420283/article/details/104055046/
# 1. 生产环境docker镜像备份
docker save -o 【备份路径】/备份文件名.tar 【镜像id】
docker export -o 【备份路径】/备份文件名.tar 【容器id】
`其中-o表示输出到文件`
eg.
# 2. 利用备份镜像加载到生产环境docker镜像中
docker load -i 【备份路径】/备份文件名.tar `保留原始镜像的tag信息,不需要自己指定`
docker import -i 【备份路径】/备份文件名.tar 【自己指定镜像tag信息:镜像名:版本号】
`其中-i表示镜像从文件输入。会成功导入镜像及相关元数据,包括tag信息
eg.
docker import /home/tpx/tpx_conda_cu101-cudnn7-ubuntu18.04.tar docker/ai_tpx:v1
export导出tar文件略小于save导出的
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。
建议
可以依据具体使用场景来选择命令:
若是只想备份images镜像,使用save、load即可
若是在启动容器后,容器内容有变化,需要备份,则使用export、import
针对于第二点, 如果想要备份容器,可将之转换为镜像 ,然后使用备份images镜像的save、load方法进行备份到本地
容器转换为镜像命令:
docker commit 【容器id】 【镜像名:版本号】
参考博客:https://blog.csdn.net/ncdx111/article/details/79878098
docker代理配置
# 1. 为docker服务创建一个内嵌的systemd目录和conf文件
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
# http-proxy.conf文件添加以下环境变量
[Service]
Environment="HTTP_PROXY=http://proxy3.bj.petrochina:8080"
Environment="HTTPS_PROXY=http://proxy3.bj.petrochina:8080"
Environment="NO_PROXY=localhost,127.0.0.1"
# 2. 查看环境变量
systemctl show --property=Environment docker
# 3. 更新配置并重启docker服务
systemctl daemon-reload
systemctl restart docker
默认从本地仓库或者国外仓库拉取基础镜像(国内仓库需要配置)
eg.
docker pull Anaconda
# 创建用户,并指定sudo权限
# 1. 创建用户
#一、新建用户adduser、useradd
# 两个用户创建命令之间的区别
#1)adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时输入用户密码。(建议使用她)
adduser 用户A,创建用户成功
passwd 用户A,设置密码
进入/etc/sudoers,添加sudo权限:用户A ALL=(ALL) NOPASSWD: ALL,保存退出
#2)useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
sudo useradd -d /home/yourname -m yourname
#2.增加sudo(root)权限
#一般三种方法:
一种是sudo usermod -aG sudo username
一种是修改/etc/sudoers文件,在root ALL=(ALL) ALL下面复制一行同样的只不过root改成你的用户名
一种是修改/etc/passwd 找到自己的用户一行吧里面的用户id改成0
# docker操作:
# 1. 如果当前服务器上没有docker组,即下面命令如果没有输出结果需要创建;
cat /etc/group|grep docker
# 2. (针对于1.没有输出)创建docker组
sudo groupadd docker
# 3. 将自己用户(如tpx)加入到docker组中
sudo gpasswd -a tpx docker
# 4. 查看是否添加成功
cat /etc/group|grep docker
groups
(非root用户,普通用户的开发操作手册)
针对于当前生产服务器中已经安装过 docker gpu服务,参考如下
官网建议:
为了避免在使用docker命令时不得不使用sudo,创建一个名为docker的Unix组,并向其中添加用户。当docker守护进程启动时,它使Unix套接字的所有权可以被docker组读写。
***alert: 本地用户不需要再装一个docker,服务器有就可用,需要进行如下配置:***下面的操作需要使用sudo,如果没有,需要root权限的用户添加给你sudo权限
# !再次强调,下面操作用户需要有sudo权限,如果没有需要和root用户申请
# 1. 如果当前服务器上没有docker组,即下面命令如果没有输出结果需要创建;
cat /etc/group|grep docker
# 2. (针对于1.没有输出)创建docker组
sudo groupadd docker
# 3. 将自己用户(如tpx)加入到docker组中
sudo gpasswd -a tpx docker
# 4. 查看是否添加成功
cat /etc/group|grep docker
groups
上面4.输出结果如下:(结果表示添加成功)
(!每个“容器"就是一个虚拟环境)
# 1. 查看本地加载的镜像
docker images
其中各个序号理解:
1. 表示镜像名 2. 表示镜像对应的版本号。 镜像唯一表示法(镜像名:版本号) 1. 表示镜像id。 镜像唯一表示法(镜像 id) 3. 镜像创建时间
alert: docker操作中,每次我们指定镜像,使用上面"镜像的唯一表示"代表指定镜像
(!每个“容器"就是一个虚拟 环境)
**补充:**
# 2 运行独立容器环境,并使得容器可见宿主机所有gpu
docker run -it -d --gpus all --restart=always --name 【容器名】【镜像id】 /bin/bash
# 2.1 快速检查容器上是否可以访问gpu
docker run -it --rm --gpus all tensorflow/tensorflow:latest-gpu-jupyter nvidia-smi
# 2.2 或者运行独立容器环境(独立的虚拟环境)
docker run -d -it --name ai_tpx docker/ai_tpx:v1 /bin/bash
# 容器随着docker启动而启动,或者直接将参数(--restart=always)加入到docker run命令
docker update --restart=always 【容器名】
这里-it是参数作用是:
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
最后的/bin/bash是command参数。
–name="": 为独立的容器虚拟环境指定一个名称;
docker/ai_tpx:v1 使用指定镜像(使用镜像唯一表示法)
其它参数,可自行了解!
# 3. 查看当前宿主机上所有的docker容器
docker ps -a
其中各个序号理解:
容器 ID
为镜像,镜像唯一表示法(镜像名:版本号)
为容器名称
补充:STATUS表示容器状态,Up表示运行,Exit表示退出
# 4. 进入指定容器
docker exec -it 【容器id/容器名】 /bin/bash
# 退出
exit
红色框表示 我们进入到虚拟容器环境的root用户下,表示成功
# 5. 用户进入容器后,可根据自己需求安装所需要的python环境-依赖包。(注意在安装python依赖包时候需要指定代理参数)
eg.
pip install virtualenv -i http://pypi.douban.com/simple --trusted-host pypi.douban.com --proxy="http://proxy3.bj.petrochina:8080"
# 6. 宿主机与docker容器里的文件相互拷贝(下面命令下宿主机上使用)
# (1)宿主机文件 拷贝 到容器
docker cp 【要拷贝到宿主机上路径】 【容器名:文件路径】
` (eg.)
` docker cp ai_tpx:/opt/module/cv/a.txt /home/tpx/opt/module/cv/
# (2)容器文件 拷贝 到宿主机
docker cp 【容器名:文件路径】 【要拷贝到宿主机上路径】
` (eg.)
` docker cp /home/tpx/opt/module/cv/tests ai_tpx:/opt/module/cv/
# 7. 一些docker命令
# 从docker仓库,或者配置的仓库环境中拉取基础镜像
docker pull 【指定镜像名:具体仓库中指定名称不能乱写】
# 查看docker历史命令
docker history
# 查看容器的状态
docker -ps -a
# 指定容器的运行、停止
docker start/stop 【容器id】
# 强制删除指定容器
docker rm -f 【容器id】
# 强制删除指定镜像
docker rmi -f 【镜像id】
# 容器转换为镜像命令(在宿主机上执行)
docker commit 【容器id】 【镜像名:版本号】
# 8. docker启动容器指定某几个gpu(某几个显卡)
# 使用第3,4张卡
--gpus='"device=3,4"'
(需要了解DockerFile指令含义)
1、 FROM(指定基础image):
构建指令,必须指定且需要在 Dockerfile其它指令的前面。后续的指令都依赖于该指令的image。FROM指令指定的基础image可以是官方远程仓库中,也可以 位于本地仓库。
example:
FROM centos:7.2
FROM centos
2、MAINTAINER(用来 指定镜像的 创建者信息 )
构建指令,用于将image的制作者相关信息写入到image中。当我们对该 image执行docker inspect命令时候,输出中有相应的字段记录该信息。
example:
MAINTAINER tpx “[email protected]”
3、RUN(安装软件用)
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件 管理部分只能使用Centos的包管理命令。
example:
RUN cd /tmp && ls -al
RUN ["/bin/bash", “-c”, “echo hello”]
4、CMD(设置container启动时执行的命令):
设置指令,用于container启动时指定的操作。该指令只能在文件 中存在一次,如果有多个,则只执行最后一条
example:
CMD echo “hello, world!”
5、ENTRYPOINT(设置container启动时执行的 操作):
设置指令,指定容器启动时执行的命令,可以多次设置,也是执行最后一个。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
6、ADD(将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget)
格式:
ADD <src>... <dest>
ADD ["" ,... "" ] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
7、COPY(功能类似ADD,但是是不会自动解压文件,也不能访问网络资源)
8、LABEL(用于为镜像 添加元数据)
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
9、ENV(设置环境变量)
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
10、EXPOSE(指定于外界 交互的端口)
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080 EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
11、VOLUME(用于指定持久化目录)
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"\
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
12、WORKDIR(工作目录,类似于cd命令)
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
13、USER(指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户)
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过`docker run`运行容器时,可以通过-u参数来覆盖所指定的用户。
14、ARG(用于指定传递给构建运行时的变量)
格式: ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
15、ONBUILD(用于设置镜像 触发器)
格式: ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
# DockerFile生产镜像的命令
docker build -t 【镜像名:自己给定】 【DockerFile路径】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r68FVnVM-1619507054386)(C:\Users\mazhe\AppData\Roaming\Typora\typora-user-images\image-20210421163113697.png)]
以下是一个小例子:
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER tpx
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]