docker基础及各种镜像使用
docker
建议使用linux系统安装docker,如果使用windows则需要bios开启虚拟化,cpu为64位,系统安装hyper-v的组件
- 网上资料解释:
Docker 底层的核心技术包括 Linux 上的名字空间( Namespaces) 、 控制组( Control groups) 、 Union 文
件系统( Union file systems) 和容器格式( Container format) 。
我们知道, 传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的
操作系统。 虚拟机系统看到的环境是可限制的, 也是彼此隔离的。 这种直接的做法实现了对资源最完整的
封装, 但很多时候往往意味着系统资源的浪费。
例如, 以宿主机和虚拟机系统都为 Linux 系统为例, 虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。
我们知道, 在操作系统中, 包括内核、 文件系统、 网络、 PID、 UID、 IPC、 内存、 硬盘、 CPU 等等, 所有
的资源都是应用进程直接共享的。 要想实现虚拟化, 除了要实现对内存、 CPU、 网络IO、 硬盘IO、 存储空
间等的限制外, 还要实现文件系统、 网络、 PID、 UID、 IPC等等的相互隔离。 前者相对容易实现一些, 后
者则需要宿主机系统的深入支持。
随着 Linux 系统对于名字空间功能的完善实现, 程序员已经可以实现上面的所有需求, 让某些进程在彼此
隔离的名字空间中运行。 大家虽然都共用一个内核和某些运行时环境( 例如一些系统命令和系统库) , 但
是彼此却看不到, 都以为系统中只有自己的存在。 这种机制就是容器( Container) , 利用名字空间来做权
限的隔离控制, 利用 cgroups 来做资源分配。
安装
linux
安装组件:
sudo apt install curl
阿里云镜像安装
- 下载路径:
sudo curl -fsSL https://get.docker.com | bash -s
docker --mirror Aliyun
- 下载路径:
官方安装
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
如果提示无法定位软件包 docker-compose-plugin
,则update或者更换源
下载完成后查看一下版本信息
docker -v
Debian下可直接通过apt安装
apt install docker.io
Ubuntu下离线安装
1 | 1. 在联网的环境中拉取Docker的安装包和镜像 |
-windows下,则下载官方桌面端,双击安装。记得先打开系统的虚拟化组件。
>vbox虚拟机和docker,或者wsl只能用一个
管理员身份启动cmd
关闭
`bcdedit /set hypervisorlaunchtype off`
开启
`bcdedit /set hypervisorlaunchtype auto`
关闭虚拟机平台,vbox可启动
打开的化,vbox无法使用,可使用windos本身的虚拟机
windows
- 在docker官网直接下载dockers desktop
- 如果没有hyper支持,可以用旧版本的docker toolbox,在阿里云镜像站docker页面 ,这个是一组套件,相当于在vbox虚拟机里运行docker。
配置加速器
1 | 针对安装了Docker Toolbox的用户,您可以参考以下配置步骤: |
start working→
使用
jenkins
1 | docker pull jenkins/jenkins |
net6
- 镜像创建
- Dockfile
1
2
3
4
5
6
7
8#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 1888
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . .
ENTRYPOINT ["dotnet", "XXXX.dll"] - publish
发布选项对应平台记得匹配docker的系统,linux或者win - 进入发布好的目录
命令行,执行docker build -t myimagename .
- Dockfile
- 启动
这里主要,最好把静态文件和配置文件映射出来方便修改,还有端口docker run -itd --name myname-p myport:1802 -v myfile/appsettings.Production.json:/src/appsettings.Production.json --network bridge diyname /bin/bash
- 网络
面的命令网络选择为网桥,所以会有一个虚拟网络地址转换。如何要实现和宿主机或者其他容器的通讯,首先在命令界面ipconfig /all
查出本机虚拟网卡的实际地址,如果win系统开启了虚拟化,则虚拟网卡名称为Hyper-V Virtual Ethernet Adapter
,这个就是宿主机的虚拟网络中的地址。因为我的mysql是装在宿主机,所以容器连接需要使用该地址。 - mysql授权
1
2
3
4
5
6
7mysql> use mysql;
Database changed
mysql> update user set host = '%' where user = 'root';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec) - 遇到问题
部分页面打开报错,提示找不到Views下的Index,这里主要的原因时因为,页面名称为小写的i,index的都打不开,但在win系统下是可以的。
ghost
nodejs轻量级博客系统
1 | docker pull ghost |
wikiJS
Docker | Wiki.js
requarks/wiki - Docker Image | Docker Hub
1 | #这里之前错误的拉成了arm的版本,导致无法启动,可以不填具体版本,默认就行 |
aria2
1 | oldiy/aria2-ui-ng |
tomcat
1 | $ sudo docker run -itd ubuntu:14.04 /bin/bash |
-i:表示以“交互模式”运行容器
-t:表示容器启动后会进入其命令行
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
mysql
- arm版本:
docker pull arm64v8/mysql
- 普通版:
docker pull mysql:8.0.31
1 | # docker run -itd --name mysql |
kali
1 | docker run -itd --name kali 01eef62a8b9b --restart=always /bin/bash |
awtrix2
(指定环境变量,时区)
1 | docker run -d --name awtrix2 --restart always \ |
cloudnas/clouddrive
1 | docker run -d --name clouddrive --restart unless-stopped -p 9798:9798 cloudnas/clouddrive |
phpzender
docker run -d -p 803:10081 --name phpzender2 php-zendserver:9.0-php7
xampp
1 | docker run -d -p 805:80 --name xampp |
openauth
- 根据自制的镜像启动
- 在项目目录下新建Dockerfile,然后运行docker build,生成image
1
2
3
4
5
6
7FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine
COPY . /publish
WORKDIR /publish
EXPOSE 6000
CMD ["dotnet", "OpenAuth.App.dll", "--server.urls", "http://*:60000"]:q
docker run -d -v /root/publish/:/publish/
--name openauth -p 6000:6000 openauth:v1要重新打tag的话,语法是:
docker tag imageId repository:newTag
常用命令
清除所有运行的容器包括镜像
docker system prune -a -f
启动容器支持中文
docker run -i -t mysql env LANG=C.UTF-8 /bin/bash
创建一个守护态的Docker容器
$ sudo docker run -itd ubuntu:14.04 /bin/bash
进入一个已经在运行的容器
1
2
3$ sudo docker ps
$ sudo docker exec -it 775c7c9ee1e1 /bin/bash
$ sudo docker exec -it 775c7c9ee1e1 /bin/sh如果容器本身以bash建立,直接用attach进入,不是则exec
创建一个容器,退出时删除
$ docker run --rm <container_id>
暂停和恢复
1 | docker pause |
修改参数
1 | //docker container update --restart=always |
保存新的镜像
将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。
1 | docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 |
- 导出
docker save ae513a47849c > nginx-save.tar
提交到docker hub
1 | //登录后,需要在docker仓库先creat |
查询docker日志的存储目录
1 | docker inspect container_ID | grep json.log` |
清docker日志
cat /dev/null > /var/log/…log-json.log
查询并取消容器挂载位置
1 | cat /proc/mounts |grep "docker" |grep "caf8ef20f3c1" |
进行安装htop工具
$:sudo apt-get install htop
- 安装后使用$:htop命令可以更直观查看CPU使用信息
防火墙
查看防火墙状态
sudo ufw status开启防火墙
sudo ufw enable关闭防火墙
sudo ufw disable防火墙没问题可能就是80端口没开,执行:
iptables -I INPUT -p tcp –dport 36572 -j ACCEPT- 1、清空iptables所有配置(新系统操作)
sudo iptables -F
sudo iptables -X
sudo iptables -Z
- 2、放行SSH远程22端口及lookback规则:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 22 -j ACCEPT
- 3、配置默认动作为拒绝,只允许流出数据:
sudo iptables –policy OUTPUT ACCEPT
sudo iptables –policy FORWARD DROP
sudo iptables -P INPUT DROP
>操作这部之前,请确保放行了ssh或者其他远程端口.
- 4、配置放行的关联规则包
1 | sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
- 5、Ubuntu保存iptables配置与开机启动(root账号下)
>如果是普通用户,请切换到root
1 | super@super:~$ su - root |
5.1、ubuntu配置规则开机自启动(可以普通账号下)
1
2
3
4super@super:~$ more /etc/rc.local
#请先配置rc.local服务自启动
#!/bin/bash
#rc.local启动iptables配置恢复,默认重启系统iptables配置丢失.
1
2iptables-restore < /etc/iptables-rules
exit 0
Docker 镜像和容器的导入导出
- 镜像的导出和导入
- 镜像的保存
1 | [root@k8s-master ~]# docker images |
- 第二种写法:
docker save -o nginx-save.tar ae513a47849c
- 2.镜像的导入
- 可以将导出的nginx-save.tar包传到需要的docker主机上面,然后执行导入命令.
1 | [root@k8s-master tmp]# ls -lh |
- 第三种写法:
docker load -i nginx-save.tar
容器的导出和导入
1.容器的导出
1
2
3
4[root@k8s-master tmp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
220aee82cfea tomcat:7 "catalina.sh run" 9 seconds ago Up 7 seconds 8080/tcp tomcat7
docker export -o mysql-`date +%Y%m%d`.tar 220aee82cfea2.容器的导入
docker import my_ubuntu_v3.tar runoob/ubuntu:v4
镜像和容器 导出和导入的区别:
1.镜像导入 是复制的过程
2.容器导入 是将当前容器 变成一个新的镜像
save 和 export区别:
- 1)save 保存镜像所有的信息-包含历史
- 2)export 只导出当前的信息
docker save images_name:
- 将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
- docker export container_id:
- 将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
普通启动的容器
1
2runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
各个参数解析:
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo “Hello world”: 在启动的容器里执行的命令
运行交互式的容器
我们通过docker的两个参数 -i -t,让docker运行的容器实现”对话”的能力1
2runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@dc0050c79503:/#各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
1 | runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" |
- 首先,我们需要确认容器有在运行,可以通过 docker ps 来查看
runoob@runoob:~$ docker ps
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器内使用docker logs命令,查看容器内的标准输出
runoob@runoob:~$ docker logs 2b1b7a428627
构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
1 | runoob@runoob:~$ cat Dockerfile |
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
1 | runoob@runoob:~$ docker build -t runoob/centos:6.7 . |
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
我们可以使用新的镜像来创建容器
runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash
[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
从上面看到新镜像已经包含我们创建的用户runoob
网络端口映射
我们创建了一个 python 应用的容器。
1 | runoob@runoob:~$ docker run -d -P training/webapp python app.py |
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
我们使用 -P 参数创建一个容器,使用 docker ps 来看到端口5000绑定主机端口32768。
另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。
1 | runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py |
这样我们就可以通过访问127.0.0.1:5001来访问容器的5000端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
1 | runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py |
docker port 命令可以让我们快捷地查看端口的绑定情况。
1 | runoob@runoob:~$ docker port adoring_stonebraker 5000 |
容器连接
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用–name标识来命名容器,例如:
runoob@runoob:~$ docker run -d -P –name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我们可以使用 docker ps 命令来查看容器名称。
1 | runoob@runoob:~$ docker ps -l |
- Docker文件目录和容器内部操作
- Docker默认的文件目录位于Linux server的/var/lib/docker 下面。目录结构如下
|—–containers:用于存储容器信息
|—–image:用来存储镜像中间件及本身信息,大小,依赖信息
|—–network
|—–swarm
|—–tmp:docker临时目录
|—–trust:docker信任目录
|—–volumes:docker卷目录
还可以通过docker指令确认文件位置:
docker info
查看某个容器的文件目录
docker exec 容器name ls
文件互相拷贝
- 将本地文件拷贝到docker 镜像内
1
2docker cp 本地路径 容器Id或name:容器目录
docker cp /Users/howey/Documents/apache-maven-3.5.2/ containername:/opt - 将docker内文件拷贝到本地文件夹内
1
2docker cp 容器Id或name:本地路径 镜像路径
docker cp containername:/Users/howey/Documents/apache-maven-3.5.2 /opt/
如何进入容器内部呢:使用docker exec可以进入Docker容器并运行指令
1 | #docker exec 在运行的容器中执行命令 |
OPTIONS说明:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
通过 exec 命令对指定的容器执行 bash:docker exec -it 容器ID或name bash
-it : 目前的理解浅薄,就是要等在容器内的命令执行完毕才会出来到当前操作; 没有-it的加 就相当于在容器内执行一下命令,不等容器内部是否执行完毕直接出来.
案例:在容器内创建sqlserver目录,如下所示,安装sqlserver后实际上已经自动创建了data目录,映射的时候无需再次创建直接使用即可.
1 | # docker exec -it sqlserver bash |
- 标题: docker基础及各种镜像使用
- 作者: PH88
- 创建于 : 2024-02-01 09:41:05
- 更新于 : 2024-05-31 11:50:33
- 链接: https://ph88.ink/2024/02/01/docker/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。