下载安装
在线
1.设置yum镜像源
#备份原配置文件
#如果没有wget,先下载
yum install -y wget
#查看yum源信息
yum repolist
#安装base reop源
cd /etc/yum.repos.d
#接着备份旧的配置文件
mv -f /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo#mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo#清理缓存
yum clean all
#重新生成缓存
yum makecache
#再次查看yum源信息
yum repolist
# 更新镜像配置,可以看到阿里镜像源
yum -y update
2.使用yum安装
yum install -y docker
3.查看是否安装成功
yum list installed | grep docker
4.启动服务
systemctl start docker
5.加入开机启动
systemctl enable docker
6.检查启动是否成功
systemctl status docker
如果启动报错,出现类似于selinux不支持的错误,则需要关闭selinux
离线
1.下载docker二进制文件
https://download.docker.com/linux/static/stable/x86_64/
https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/
2.解压安装
#建立存放文件夹
mkdir mydocker
cd mydocker/
#上传文件到文件夹
3.解压
tar xzvf docker-你下载的版本.tgz
4.复制二进制文件
cp docker/* /usr/bin/
5.建立docker.service
vi /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
[Service]
Environment=“PATH=/usr/bin:/bin:/sbin:/usr/bin:/usr/sbin”
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/bin/dockerd --graph=/var/lib/docker --log-level=error $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
6.给docker.service权限
chmod +x /usr/lib/systemd/system/docker.service
7.加载配置
[systemctl daemon-reload
8.启动
systemctl start docker.service
9.设置开机自启动
systemctl enable docker
10.查看状态
systemctl status docker
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是阿里的镜像地址:
在/etc/docker/daemon.json文件中添加如下内容.
{
"registry-mirrors": ["https://wghlmi3i.mirror.aliyuncs.com"]
}
或者如下地址
{
"registry-mirrors": ["https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"]
}
如果报错类似如下,则需要时钟同步
Error response from daemon: Get "https://index.docker.io/v1/search?q=ngix&n=25": x509: certificate has expired or is not yet valid: current time 2023-04-20T14:05:12-04:00 is before 2023-05-05T00:00:00Z
解决方案:
date -s "2023-05-22 23:09:00"
clock -w
常用命令
镜像操作
获取镜像: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
# 拉取镜像
docker pull ngix
# 删除镜像
docker rmi ngix
# 在远程仓库搜索镜像
docker search ngix
# 列出本地images
docker images
# 基于当前redis容器创建一个新的镜像;参数:-a 提交的镜像作者;-c 使用Dockerfile指令来创建镜像;-m :提交时的说明文字;-p :在commit时,将容器暂停
docker commit -a="DeepInThought" -m="my redis" [redis容器ID] myredis:v1.1
镜像搜索
1.docker search 搜索内容
如果search出来的镜像,不是自己想要的版本,可通过在docker hub上搜索好版本TAG
地址如下:https://hub.docker.com/
2.进入之后,在页面左上角搜索框搜索
3.进入满足条件的搜索结果
4.点击Tags
5.选中满足条件的Tags,点击进入
6. 图示处就是需要复制的内容
7.拉取镜像
docker pull mysql:debian
镜像信息查看
通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。
docker inspect docker.io/mysql:5.7
通过 docker history 命令,可以列出各个层(layer)的创建信息,如我们查看 docker.io/mysql:5.7 的各层信息:
docker history docker.io/mysql:5.7
可以看到,上面过长的信息,为了方便展示,后面都省略了,如果您想要看具体信息,可以通过添加 --no-trunc 选项,如下面命令:
docker history --no-trunc docker.io/mysql:5.7
镜像打包
1.构建dockerfile
样例
open-jdk环境
#依赖基础镜像
FROM openjdk:8
MAINTAINER HUI
LABEL app="myApp" version="0.0.1" by="hui"
COPY ./pay_news_spider /opt/
WORKDIR /opt
ENTRYPOINT ["java","-jar","/opt/pay_news_spider/pay_news_spider.jar"]
自定义java环境
FROM centos:7
USER root
MAINTAINER HUI
LABEL app="paynewsyn" version="2" by="hui"
COPY ./pay_news_spider /opt/
COPY ./pay_news_spider/conf/busi.conf /tmp/conf/
WORKDIR /opt
#ADD 是相对路径jar,把java添加到容器中
ADD jdk1.8.0_112.tar.gz /opt/java/
#配置java环境变量
ENV JAVA_HOME /opt/java/jdk1.8.0_112
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH#设置系统编码
RUN yum install kde-l10n-Chinese -y
RUN yum install glibc-common -y
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#RUN export LANG=zh_CN.UTF-8
#RUN echo "export LANG=zh_CN.UTF-8" >> /etc/locale.conf
#ENV LANG zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
chrome环境
FROM selenium/standalone-chrome:latest
USER root
MAINTAINER HUI
LABEL app="myApp" version="0.0.1" by="hui"
COPY ./pay_news_spider /opt/
COPY ./pay_news_spider/conf/busi.conf /tmp/conf/
WORKDIR /opt
#ADD 是相对路径jar,把java添加到容器中
ADD jdk1.8.0_112.tar.gz /opt/java/
#配置java环境变量
ENV JAVA_HOME /opt/java/jdk1.8.0_112
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
ENTRYPOINT ["java","-jar","/opt/pay_news_spider.jar"]
2.build
docker build -t paynewsyn:5 .
容器操作
启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动。
docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
# 运行一个容器,打印Hello world后退出
docker run alpine /bin/echo 'Hello world'
# 创建一个交互容器 退出当前命令,容器也随之退出
docker run -it alpine
# 创建一个后台运行容器
docker run -d --name demo1 alpine sleep 10m
run命令常用参数:
-t 参数让Docker分配一个伪终端并绑定到容器的标准输入上
-i 参数则让容器的标准输入保持打开。
-c 参数用于给运行的容器分配cpu的shares值
-m 参数用于限制为容器的内存信息,以 B、K、M、G 为单位
-v 参数用于挂载一个volume,可以用多个-v参数同时挂载多个volume
-p 参数用于将容器的端口暴露给宿主机端口 格式:host_port:container_port 或者
host_ip:host_port:container_port
--name 容器名称
--net 容器使用的网络-d:看做做守护线程(Daemon)
--restar=always:自动重启,比如服务器突然断电,重启服务器之后不需要你重新手动启动
#修改-name和 -p中宿主机的端口可以在同一机器启动多个服务
启动停止容器
docker stop demo1
docker start demo1
docker restart demo1
查看容器
# 查看正在运行的容器
docker ps
# 查看所有容 包括停止的容器
docker ps -a
# 查看容器详细信息
docker inspect demo1
容器进程
#top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
#列出redis容器中运行进程
docker top redis
#查看所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
容器日志
#查看redis容器日志,默认参数
docker logs redis
#查看redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail 仅列出最新N条容器日志;
docker logs -f -t --tail=20 redis
#查看容器redis从2020年06月01日后的最新10条日志。
docker logs --since="2020-06-01" --tail=10 redis
进入容器
docker exec -it demo1 /bin/sh
删除容器
# 删除一个已经停止运行的容器
docker rm demo1
# 强制删除正在运行的容器
docker rm -f dome1
停止容器
#停止一个运行中的容器
docker stop redis
#杀掉一个运行中的容器
docker kill redis
导入导出容器
# 将容器导出为镜像
docker export demo1 > demo1.tar
# 导入镜像
docker import demo1.tar xxx/demo--------------------------------------------------------------------------------------------------------------------
#将指定镜像保存成 tar 归档文件
docker save -o mysql.tar docker.io/mysql:debian
docker load < mysql.tar
#如果load以后 显示tags为空,可以用docker tag 标记本地镜像,将其归入某一仓库。
docker tag ubuntu:15.10 runoob/ubuntu:v3
----------------------------------------------------------------------------------------------------------------------
#可以将容器的存储层保存下来成为镜像然后再导出
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
数据拷贝
docker cp :用于容器与主机之间的数据拷贝。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker-compose安装
#下载
wget --no-check-certificate https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64
#移动到执行目录
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
#授权
chmod 777 /usr/local/bin/docker-compose
#验证
docker-compose -v
如何基于已有容器构造新的镜像?
对于一些比较复杂的docker环境,有的不是在docker build一步到位,是启动一个基础镜像以后,
通过 docker run -it demo /bin/bash 进入容器中把环境弄好。
或者是后续的迭代是在容器中更新的,另外一个新的程序需要用到这个环境。
实验测试:
1.基于一个docker中运行的python脚本测试
mkdir build_test1
cd build_test1
dockerfile文件
from docker.io/python
USER root
MAINTAINER HUI
LABEL app="myApp_extend" version="0.0.1" by="hui"
COPY ./test1.py /opt/
WORKDIR /opt
ENV arg1="dev"
ENV arg2="dev"
CMD ["/bin/sh", "-c", "python /opt/test1.py $arg1 $arg2"]
test1.py
# -*- coding: utf-8 -*-
import sys
if len(sys.argv) > 1:
print("第一个输入参数为:", sys.argv[1])
else:
print("没有输入参数!")
#打包
docker build -t my_app_test:1 .
#运行
docker run --rm --name py_test1 -e arg1=1111 -it my_app_test:1
2.保存为新的镜像
docker commit py_test1 my_app_test:2
3.模拟场景,我需要修改程序,修改启动的参数,重新构造镜像
test.py
# -*- coding: utf-8 -*-
import sys
if len(sys.argv) ==2:
print("第一个输入参数为:", sys.argv[1])
elif len(sys.argv) == 3:
print("第一个输入参数为:", sys.argv[1])
print("第二个输入参数为:", sys.argv[2])
else:
print("没有输入参数!")
#基于my_app_test:2构建容器
dockerfile
from my_app_test:2
USER root
MAINTAINER HUI
LABEL app="myApp_extend" version="0.0.1" by="hui"
COPY ./test1.py /opt/
WORKDIR /opt
ENV arg1="dev"
ENV arg2="dev"
CMD ["/bin/sh", "-c", "python /opt/test1.py $arg1 $arg2"]
4.重新打包
docker build -t my_app_test:3 .
5.启动新的镜像
docker run --name py_test3 -e arg1=1111 -e arg2=222 -it my_app_test:3
Docker容器启动时获取启动参数
方案1:推荐此方案
test.py
# -*- coding: utf-8 -*-
import sys
if len(sys.argv) ==2:
print("第一个输入参数为:", sys.argv[1])
elif len(sys.argv) == 3:
print("第一个输入参数为:", sys.argv[1])
print("第二个输入参数为:", sys.argv[2])
else:
print("没有输入参数!")
dockerfile
from docker.io/python
USER root
MAINTAINER HUI
LABEL app="myApp_extend" version="0.0.1" by="hui"
COPY ./test1.py /opt/
WORKDIR /opt
ENV arg1="dev"
ENV arg2="dev"
CMD ["/bin/sh", "-c", "python /opt/test1.py $arg1 $arg2"]
#打包
docker build -t my_app_test:1 .
#启动
docker run --name py_test -e arg1=1111 -e arg2=222 -it my_app_test:1
方案2
test.py
# -*- coding: utf-8 -*-
import sys
import os
arg1 = os.environ.get('arg1')
arg2 = os.environ.get('arg2')
print('第一个参数 arg1为====',arg1)
print('第一个参数 arg2为====',arg2)
dockerfile
from docker.io/python
USER root
MAINTAINER HUI
LABEL app="myApp_extend" version="0.0.1" by="hui"
COPY ./test1.py /opt/
WORKDIR /opt
ENV arg1="dev"
ENV arg2="dev"
ENTRYPOINT ["python","/opt/test1.py"]
#打包
docker build -t my_app_test:1 .
#启动
docker run --name py_test -e arg1=1111 -e arg2=222 -it my_app_test:1
来源