Docker
安装Docker
先查看自己系统的环境:我用的是centos 8
环境查看
[root@iZ2zedsctsh21tlseacu5lZ /]# uname -r
4.18.0-147.5.1.el8_1.x86_64
系统版本
[root@iZ2zedsctsh21tlseacu5lZ /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、需要地安装包
yum install -y yum-utils
3、设置镜像的仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//https://download.docker.com/linux/centos/docker-ce.repo
4、更新yum软件索引
yum makecache fast
5、安装最新版本的docker
yum install docker-ce docker-ce-cli containerd.io
6、启动docker
systemctl start docker
7、查看docker
docker version
8、测试hello world
docker run hello-world
9、查看一下下载的hello world的镜像
docker images
9、卸载docker
yum remove docker-ce docker-ce-cli containerd.io
删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
# 重载所有修改过的配置搵件
sudo systemctl daemon-reload
# 重启Docker服务
sudo systemctl restart docker
Docker的常用命令
docker images --help docker的帮助命令
docker镜像命令
docker images 查看所有本地主机上的镜像
[root@iZ2zedsctsh21tlseacu5lZ lib]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
REPOSITORY:镜像的仓库名称
TAG:版本
IMAGE ID:镜像的id
# -a 列出所有镜像
# -q 只显示镜像的id
docker的搜索命令
docker search MySQL
[root@iZ2zedsctsh21tlseacu5lZ lib]# docker search MySQL
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation?? 10984 [OK]
mariadb MariaDB Server is a high performing open sou?? 4152 [OK]
# --filters=stars=3000 搜索大于3000的
docker下载镜像
docker pull mysql 默认是下载最新的版本
[root@iZ2zedsctsh21tlseacu5lZ lib]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
# docker pull mysql:5.7指定版本下载
docker rmi 删除镜像
docker rmi -f [容器的id] #根据容器id删除镜像
docker rmi -f [容器的id] [容器id] #批量的删除镜像
docker rmi -f $(docker images -aq)#删除全部的镜像
docker容器命令
1、容器的启动命令
docker run …
docker run mysql #启动MySQL
#参数说明
--name="mysql" 容器名字,用来区分容器
-d 后台方式运行,容器使用后台运行,需要有一个前台应用,但这个命令不会开启前台命令,所以通过 docker ps 查找时,发现应用并没有启动
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080
#测试 服务器端口 docker容器
docker run -d --name myMsql -p 3306:3306 将Tomcat后台启动并自定义名字,并将容器中的3306端口映射到服务器上的3306端口
# 测试,启动并进入容器
docker run -it mysql /bin/bash
ls #查看容器内的MySQL
exit # 退出容器并停止容器
Ctrl + P + q 容器不停止退出
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
........
2、列出所有运行的容器
//配置MySQL,并将容器中MySQL中的一些文件映射到服务器上,方便修改
docker run -d --name mysql -p 39001:3306\
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7
docker ps
docker ps -a 列出当前+曾经运行的容器
3、删除容器
docker rm [容器id]
docker rm $(docker ps -aq) 删除所有的容器
4、容器的启动和停止操作
docker start [CONTAINER ID] 启动容器
docker stop [容器id] 停止容器
docker restart [容器id] 重新启动容器
docker kill [容器id] 直接杀死容器
其他常用命令
1、查看日志: docker logs [OPTIONS] CONTAINER
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
2、查看容器中的进程信息
docker top 容器id
[root@iZ2zedsctsh21tlseacu5lZ ~]# docker top 67f6fabe53ce
UID PID PPID C STIME TTY TIME CMD
root 16705 16684 1 21:35 pts/0 00:00:00 /bin/bash
3、查看镜像的元数据
docker inspect 容器ID
4、进入当前正在运行的容器
//docker exec -it [容器id] bashShell
docker exec -it [容器id] /bin/bash 进入容器后会开启一个新的终端 docker exec -it mysql /bin/sh
docker exec -it redis redis-cli 使用redis镜像执行redis-cli连接
docker attach [容器id] 进入容器正在执行的终端
5、从容器内拷贝文件到主机
docker cp [容器id]:容器内路径 目标主机路径
6、查看docker的内存消耗
docker stats
镜像概述
docker run -p 6379:6379 --name redis
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf
镜像:镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个[磁盘]上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件。我们可以将jar包,及运行该jar包所需要的环境一起打包docker镜像,可以一键部署。
联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
**bootfs(boot file system)**主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的, 包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system), 在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
提交自己的镜像
docker commit -a=“作者” -m=“提交的信息” [要提交的容器的id] [目标镜像名:版本]
docker容器卷
简介
卷的设计目的就是数据的持久化和同步,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
挂载卷到主机上
方式一:将卷挂载到主机上,容器中的操作会自动同步到主机中
docker run -it -v [主机目录:容器目录]
docker run -it -v /home/test:/home mysql /bin/bash
#启动MySQL并将卷挂载,还需要设置MySQL的登录密码 -e
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
具名挂载和匿名挂载
#匿名挂载 挂载到容器内路径
docker run --name some-mysql -v etc/mysql/conf.d
docker run --name some-mysql -v etc/mysql/conf.d:ro #添加readonly权限
#查看volume的情况
docker volume ls
#查看卷的具体信息
docker volume inspect [custom]
#具名挂载 挂载到指定主机
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d
2、使用dockfile来进行挂载卷的操作
#--volumes-from用来联通两个容器
docker run -it --name myMysql --volumes-from /etc/mysql
dockerFile
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile
中的指令自动生成映像。
docker build
命令用于从Dockerfile构建映像。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。
dockerfile常用指令
#例如:
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER zcc
#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"]