docker的安装
-
删除旧docker,因为有些linux系统会自带一个老版本的docker
yum -y remove docker docker-common container-selinux
-
安装yum-utils,安装docker时候的工具包
yum install -y yum-utils
-
安装docker,如果成功就不用执行下面的步骤了
yum install docker-engine
-
如果提示找不到docker说明Linux原始的软件源中没有docker,需要更改软件源
- 进入/etc/yum.repos.d目录
- 删除里面原来的.repo文件
- 创建Centos-7.repo文件并编辑内容,拷贝以下所有内容到该文件中
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-7 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-7 - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/7/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-7 - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/7/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-7 - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/7/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
#contrib - packages by Centos Users
[contrib]
name=CentOS-7 - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/7/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
创建并编辑该文件
vim /etc/yum.repos.d/docker.repo
文件内容如下
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
-
更新yum源
yum clean all yum makecache fast
-
再次安装docker
yum install docker-engine
-
没网络的安装方式(没有尝试过不确定可行)
-
使用rpm 包的方式进行安装
-
可以从 https://yum.dockerproject.org/repo/main/centos/ 中选择合适的CentsOS版本下载rpm包注意stable和testing
-
安装 docker
sudo yum -y install /path/to/package.rpm
-
使用这种方式可能需要手动处理依赖问题。
-ivh name.rpm --nodeps --force ##忽略依赖性并且强制安装
-
docker的使用
- 所有指令如果不是root用户执行的都需要在指令前加sudo
启动docker
systemctl start docker
设置开机启动docker
chkconfig docker on
查看本机所有的镜像文件
* docker images
这里的镜像相当于是一个容器的副本类似于ios镜像一样,通过这一个镜像可以启动多个容器。
启动后的容器类似于虚拟机一样有独立的linux环境。
通过docker可以确保开发环境和使用环境保持一致,避免因为环境导致软件无法运行
将镜像保存为本地文件
使用save 导出这种方式导入时候必须使用load导入
docker save ubuntu > /root/ubuntu.tar
通过image id导出
docker save eb40dcf64078 > /root/tomcat.tar
使用export 导出这种方式导入的时候必须使用import导入
docker export 98ca36> ubuntu.tar
将文件下载到本地电脑,默认在C:\Users\用户名\Downloads
-
在SecureCRT 8.1中使用sz指令可以将上一步生成的tar包下载到本机
-
默认下载路径就是电脑的下载路径,也可以在options->session options->x/y/zmodem中修改下载的路径
sz ubuntu.tar
加载镜像到新机器
必须是save导出的tar文件才可以使用load 导入
docker load < ubuntu.tar
这个必须搭配export导出的才能用
docker import - tomcat:latest < tomcat.tar 指定镜像的REPOSITORY、TAG导入
修复新添加镜像REPOSITORY,TAG为none的情况
- 在新的机器上再此使用
docker images
命令查看本机的镜像 - 检查刚才load的镜像有没有加载进来,发现加载进来的镜像名称、标签均为none
- 使用
docker tag eb40dcf64078 django:latest
修改为原来的镜像名称和标签名称 - 其中eb40dcf64078 为images id,django是镜像名(REPOSITORY),latest是标签名(TAG)
运行镜像到容器
使用docker run -itd django:latest 加载镜像到容器,验证镜像是否能够成功运行
不成功通常是使用了不搭配的导入导出导致的,save和load命令,export和import命令要匹配不能混用
使用dockerfile生成镜像
docker build imagesproject/ -t tomcat:latest
- imagesproject/是项目路径,里面包含一个
dockerfile
-t tomcat:latest
指定构建后的镜像的名字和版本号- 在构建镜像的时候dockerfile中的指令可以访问其所在目录下的目录
查看正在运行的容器
docker ps
进入正在运行的容器
-
进入正在运行的容器的linux环境当中
docker exec -it d48b21a7e439 /bin/sh
-
其中
d48b21a7e439
为CONTAINER ID -
需要注意容器内的linxu环境极度精简只能使用基础命令,在有网络的情况下也可以安装指令
-
在容器内的操作不会影响到镜像,通过镜像启动的新的容器还是没有修改前的状态,因为启动的时候是基于镜像启动的,生成好的镜像只能用dockerfile修改后创建新的镜像
停止正在运行的容器
docker stop NAMES,通过docker ps查看
停止所有容器
docker stop $(docker ps -a -q)
启动容器并映射外部端口
启动tomcat镜像到8080,前者是外围访问端口:后者是容器内部端口
docker run -d -p 8080:8080 tomcat
修改已有镜像的配置
- dockerfile修改镜像的时候是基于一个已有的镜像进行修改然后生成一个新的镜像,该操作只能在linux环境执行
- 通过dockerfile创建新的镜像,创建后该镜像会保存在docker images里面,如果忘记指定新镜像的名字,则名字为none,需要通过上文的方法修复
- 修改后再把修改后的镜像下载下来
删除已有的镜像
-
删除前要停止正在运行的容器
docker ps 查看正在运行的容器 desktop stop NAMES 停止正在运行的容器
-
还要删除运行过的记录
docker ps -a 查看已经停止但是还有记录的容器 docker rm c551bb2d0b1f 删除指定容器
-
删除指定的镜像
docker images 查看所有的镜像 docker rmi 5e4f2da203e2
Dockerfile指令
-
FROM
FROM <image>或 FROM <image>:<tag>
第一条指令必须为FROM指令。
-
MAINTAINET
MAINTAINET <name>
指定维护者的信息
-
RUN
RUN <command> 或 RUN ["", "", ""]
每条指令将在当前镜像基础上执行,并提交为新的镜像。(可以用“\”换行)
-
CMD
CMD ["","",""]
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD指令,如果指定了多条指令,则只执行最后一条。
-
EXPOSE
EXPOSE <port> [ <port> ...]
告诉Docker服务端对外开放的端口,在容器启动时需要通过 -p 做端口映射
-
ENV
ENV <key> <value>
指定环境变量,会被RUN指令使用,并在容器运行时保存
-
ADD
ADD <src> <dest>
复制指定的到容器的中,可以是Dockerfile所在的目录的一个相对路径;可以是URL,也可以是tar.gz(自动解压)
-
COPY
COPY <src> <dest>
复制本地主机的 ( 为 Dockerfile 所在目录的相对路径)到容器中的 (当使用本地目录为源目录时,推荐使用 COPY)
-
ENTRYPOINT
ENTRYPOINT ["","",""]
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。(每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效)
-
VOLUME
VOLUME ["/mnt"]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
-
USER
USER daemon
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
-
WORKDIR
WORKDIR /path/to/workdir
为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。(可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径, 则会基于之前命令指定的路径)
-
ONBUILD
ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
故障排除
docker安装完成后无法启动
vim /etc/sysconfig/docker-storage
编辑该文件
DOCKER_STORAGE_OPTIONS=
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
vim /etc/docker/daemon.json
编辑该文件
{ "storage-driver": "devicemapper" }
最后重启docker
systemctl restart docker