概念理解
docker可以理解为一个独立容器,把物理机想象成一个盆,docker可以划分盆内的空间,比如是一个碗。是物理机的缩小版。
以下概念需要理解
镜像:docker容器是一个独立的空间,所以和物理机一样,也需要镜像,安装系统,只不过镜像是特殊的镜像
容器:根据镜像创建出来的一个独立空间
Docker 官方镜像仓库:https://hub.docker.com/
docker镜像仓库提速方案
# 1、修改/etc/docker/daemon.json文件,没有则创建
# 输入以下内容
{
"registry-mirrors": [
"https://docker.nju.edu.cn/"
]
}
# 现在好多国内镜像源不能使用了,找到一个能使用的,https://docker.lmirror.top
# 2、重启docker服务
systemclt restart docker
# 3、验证下网速
docker pull gitlab/gitlab-ce:14.6.7-ce.0
1、安装
管网安装比较慢,可以设置为清华源,下载docker-ce
下载地址:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# centos安装
yum install docker
# ubuntu安装
apt-chche madison docker
apt-get install docker
systemctl start docker
# docker和docker-ce是同一个东西,只不过一个是商业版,一个是社区版
2、镜像相关命令
# 1、查看本机镜像
docker images
# 2、查找docker镜像源内的镜像,如查找centos7镜像
docker search centos7
# 3、拉取镜像到本地centos7:版本号
docker pull centos7:latest
# 4、删除镜像
docker rmi 镜像名称
# 5、运行镜像--创建容器
# d:后台运行
# i:以交互模式启动
# t:运行时可以独立启动一个终端
docker run -dit centos7:last /bin/bash
# 6、创建镜像副本,镜像名可以为lgh/centos7:v12,也就是作者/基础镜像:版本号
docker commit -m="update" -a="lgg" 容器id 镜像名
# 7、镜像导出为本地tar包,包名ubuntu_Alphar.tar
docker save -o ubuntu_Alpha.tar 镜像id
# 8、加载本地镜像tar
docker load -i ubuntu_Alpha.tar
# 9、加载完镜像,镜像名称和版本会是空的,设置名称和版本
docker tag 镜像id 镜像名:镜像版本
3、容器相关命令
# 1、查看所有容器
docker ps -a
# 查看运行容器
docker ps
# 2、启动容器
docker start 容器id
# 3、停止容器
docker stop 容器id
# 4、重启容器
docker restart 容器id
# 5、进入容器
docker exec -it 容器id /bin/bash
# 6、删除容器
docker rm -f 容器id
# 7、导出容器快照
docker export 容器id > export_container.tar
# 8、将快照再导入为本地镜像,镜像名为test/import:v1
cat export_container.tar | docker import - test/import:v1
# 9、查看日志命令
docker logs 容器id
3.1、重要命令
# 1、docker启动命令
docker run -dit
--net=host 设置容器网络模式为主机模式,共享主机网络
--pid=host 方便容器内部与宿主机交互,可以在容器内部运行宿主机命令
--privileged 设置启动容器拥有root权限去执行命令
-v /etc/:/var/ 设置容器/var/目录映射到主机/etc/目录
--name test 设置容器名为test
-p 80:90 将容器90端口映射到主机80端口
-h=test 设置容器主机名为test
--dns=ip_address 设置容器dns到/etc/resolv.conf中
--rm 容器退出时清理容器内部文件系统
# 2、docker拷贝命令
# 从主机拷贝a.txt文件到容器内部/root/目录下
docker cp a.txt 容器名:/root/
# 从容器内部往主机/etc/路径拷贝
docker cp 容器名:容器文件路径 /etc/
3.1、容器内部执行宿主机命令
# 使用如下命令构建容器
docker run -dit --pid=host --net=host --privileged --name test -h=test f635a6b2e0d2 /bin/bash
# 进入容器内部
docker exec -it test /bin/bash
# 容器内部使用nsenter命令运行,
# 如果没有安装utile-linux工具
yum install -y util-linux
熟悉以下概念
Linux在不断的添加命名空间,目前有:
mount:挂载命名空间,使进程有一个独立的挂载文件系统,始于Linux 2.4.19
ipc:ipc命名空间,使进程有一个独立的ipc,包括消息队列,共享内存和信号量,始于Linux 2.6.19
uts:uts命名空间,使进程有一个独立的hostname和domainname,始于Linux 2.6.19
net:network命令空间,使进程有一个独立的网络栈,始于Linux 2.6.24
pid:pid命名空间,使进程有一个独立的pid空间,始于Linux 2.6.24
user:user命名空间,是进程有一个独立的user空间,始于Linux 2.6.23,结束于Linux 3.8
cgroup:cgroup命名空间,使进程有一个独立的cgroup控制组,始于Linux 4.6
nsenter允许用户通过一个进程命名空间进入另一个进程命名空间
nsenter -m -u -i -n -p -t 1 sh -c "docker ps"
-m 挂载命名空间
-u user命名空间,是进程有一个独立的user空间
-i ipc命名空间,使进程有一个独立的ipc
-n network命令空间,使进程有一个独立的网络栈
-p pid命名空间,使进程有一个独立的pid空间
-t 1 指定我们想要进入的进程的PID。在这里,它是1。PID为1的进程通常是init进程,它是每个Linux系统上的第一个进程,也是所有其他进程的父进程。在容器中,这个init进程实际上是容器的入口点,它负责管理容器中的其他进程。
所以,当你运行这个命令时,你实际上是在容器中进入了init进程的命名空间,并在这个命名空间中执行了docker ps命令。由于容器和宿主机共享相同的网络和mount命名空间(因为我们使用了-n和-m选项),所以这个命令实际上是在宿主机上执行,而不是在容器内部。
简而言之,这个命令之所以可以执行宿主机上的命令,是因为它利用了命名空间的特性,特别是通过进入init进程的命名空间来做到这一点。而-t 1则是用来指定我们要进入哪个进程的命名空间。
sh -c "docker ps" 代表把后续字符串叫给sh脚本运行
4、docker-compose
docker-compose是一个工具,用于管理docker容器的工具,构建容器之间的关联关系,配合yml文件进行使用
所以要先熟悉yml文件格式如何编写,举例如下
# 版本号
version: '3'
# docker容器服务
services:
# 服务名,唯一
nginx:
# 该容器对应的镜像名
image: quay.io/nginx:19.0.3
# 容器名称
container_name: nginx
# 启动用户
user: root
# 重启配置
restart: always
# 设置容器内部环境变量
environment:
- KEYCLOAK_ADMIN=test
- KEYCLOAK_ADMIN_PASSWORD=123
# 网络模式-host模式
network_mode: "host"
command: ["start-dev"]
# 容器目录映射到宿主机的路径
volumes:
- /var/nginx:/opt/data/
portal:
image: ubuntu:v1
container_name: ubuntu
user: root
restart: always
# 依赖项,此容器依赖于nginx容器
depends_on:
- nginx
network_mode: "host"
# docker-compose安装
yum install docker-compose
# 启动运行命令,不跟容器名是启动所有
docker-compose -f run.yml up -d
-f 指定的yml文件,不指定默认docker-compose.yml
up 启动
-d 后台启动
# 查看运行容器
docker-compose -f run.yml ps
# 查看运行日志
docker-compose -f run.yml logs 容器id
# 停止某一容器
docker-conpose -f run.yml stop 容器名
5、Dockerfile
dockerfile是一个构建镜像的文件,文件内容有一定标准格式
举例如下:
vim Dockerfile
编写如下内容
# 基础镜像,可以是docker源,也可以是本地镜像
FROM python:3.6.8-slim
# 设置工作目录
WORKDIR /app
# 安装依赖和构建工具
RUN apt-get update
# 复制应用程序代码到工作目录
COPY ./project /project
COPY ./html /usr/share/nginx/html
# 配置uWSGI
RUN mkdir -p /etc/uwsgi && mkdir -p /app/project/log
COPY ./project/uwsgi.ini /etc/uwsgi/uwsgi.ini
# 配置Nginx
COPY ./project/package/soft/nginx.conf /etc/nginx/nginx.conf
COPY ./project/package/soft/portal_static.conf /etc/nginx/conf.d/portal_static.conf
# 暴露端口
EXPOSE 80 22 23
# 启动uWSGI和Nginx
CMD ["sh", "-c", "uwsgi --ini /etc/uwsgi/uwsgi.ini && nginx -g 'daemon off;'"]
# 切换到Dockerfile所在的目录,执行如下build命令
docker build -t test:v1 ./