目录
docker
0.绪论
程序代码上线前的固定测试环境,使用容器技术。多方测试搭建的环境会有所不同,没有容器技术之前是使用虚拟机vm之间的clone来提升效率,即虚拟技术;云计算便是基于虚拟技术将堆叠的硬件划分实现。但是单纯的虚拟机之间的clone是很耗费时间,因为整个系统资源极大。容器技术解决了虚拟机clone之间的操作系统重复占用资源的问题,将程序运行环境进行剥离。
- 虚拟技术将整个操作系统的软件与硬件部分进行了隔离处理。
- 容器技术将程序执行所需的环境(各种依赖配置及库)与操作系统进行了隔离处理。
1.原理
docker概念:
- dockerfile(指定需要的程序、依赖配置)
- images(文件系统)
- container(执行起来的进程包)
- docker hub用于下载别人编译好的image,类似于应用商城
- docker registry用于存放各种image
- 流程:通过docker build命令生成image,使用docker run将image运行起来就是docker container.
docker push 推送image到docker hub,docker pull 通过docker hub下载image
docker原理架构(client--server):
- docker client负责处理用户输入的各种命令:docker build/docker run/docker push/docker pull/...
- docker server即docker daemon依据dockerfile创建出image.
- docker cmd 效果
docker底层实现:
- NameSpace技术:将全局的Linux PID/IPC/NET等资源隔离分派给每个NameSpace,每个NameSpace下的Linux资源互不干扰,使得每一个Namespace看上去像一个独立的操作系统。
- Control groups技术:Namespace技术实现的是系统资源隔离,但是进程执行的过程中对设备资源的访问仍然不受控制,如CPU core/RAM/ROM/HDD/SSD/SD/Network等,为了分配及限制容器中的进程访问资源,docker 采用了control groups技术(cgroup)。
2.实现
易死机,诸君谨慎需提前备份
- Windows 10 安装配置docker:
- Linux(Ubuntu) 安装配置docker:
# 1. 安装流程
## 卸载已安装的旧版本docker
sudo apt-get remove docker docker-engine docker.io containerd runc
## 更新依赖包
sudo apt-get update
## 安装docker依赖
sudo apt-get install apt-transport-https
sudo apt-get install ca-certificates
sudo apt-get install curl
sudo apt-get install gnupg
sudo apt-get install lsb-release
sudo apt install lsb-core
## 添加docker官方gpg秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## 设置docker镜像仓库
echo \
> "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
> $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## 安装docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 2. 测试docker
## docker版本及holle world
sudo docker version
sudo docker run hello-world
# 3. 卸载docker及删除映像/容器/卷/配置
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
- 基于vscode使用docker基本功能:
- vscode配置
...
- 常用指令
### 查看client/server基本信息...
sudo docker info
sudo docker version
sudo docker cmd --help
### 查看本地主机images
sudo docker images
sudo docker search REPOSITORY:TAG
sudo docker pull REPOSITORY:TAG
sudo docker push REPOSITORY:TAG
### cp host--docker
docker cp [OPTIONS] SRC_PATH CONTAINER_ID:DEST_PATH
docker cp [OPTIONS] CONTAINER_ID:SRC_PATH DEST_PATH
docker cp test_rpp_client df9b4c17f509:/home/boc/kuanghl/test
### 查看docker运行状态
sudo systemctl status docker
### docker版本
sudo docker version
### 下载映像
sudo docker pull 映像名称
### 构建映像
sudo docker build -t 映像名称:tag .
### 运行映像
sudo docker run -d -p 宿主机端口:docker端口 --name 容器名称 映像名称:tag(tag应递增)
### 查看映像
docker images
### 查看容器
docker ps -a
### 删除映像
docker rmi 映像id
### 删除容器
docker rm 容器id
### 启动容器
docker start 容器id
### 停止容器
docker stop 容器id
### 进入/退出容器
docker exec -it 容器id /bin/bash
exit
### 查看容器日志
docker logs 容器id
### 查看容器内的进程
docker top 容器id
- Dockerfile语法:
# 定制构建images:`sudo docker build -t image_name:tag .`
FROM -构建镜像基于哪个镜像
MAINTAINER -镜像维护者姓名或邮箱地址
RUN -构建镜像时运行的指令
ADD -拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
CMD -运行容器时执行的shell环境
ENTRYPOINT -运行容器时执行的shell命令
ENV -设置容器环境变量
ARG -构建时指定的一些参数
VOLUME -指定容器挂载点到宿主机自动生成的目录或其他容器
EXPOSE -声明容器的服务端口
WORKDIR -为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
USER -为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
HEALTHCHECK -健康检查
ONBUILD -延迟构建命令的执行
LABEL -指令用来给镜像添加一些元数据
- docker配置:
# Set the IPC mode for the container
--ipc="MODE"
# create container based on images_id
docker run -it --ipc=shareable --name container_name images_id /bin/bash
3.测试
- rpptest:
-
- open terminal1:
docker images
&&docker ps -a
&&docker start CONTAINER ID
&&docker attach CONTAINER ID
&&su - boc
(进入容器)
- open terminal1:
-
- open terminal2:
docker cp file_or_dir CONTAINER ID:dir
&&ifconfig
&&cd rpp_drv_api/build
(将要跑的测试例程序cp到docker,并查看容器的ip,到执行文件夹)
- open terminal2:
-
- in terminal1:
export RPP_SOCK_SERVER_IP="docker0: inet_ip"
&&ls
&&cd cp_dstdir
(设置ip,到测试例程序执行文件夹)
- in terminal1:
-
- in terminal2:
./bin/rpp_server
- in terminal2:
-
- in terminal1:
执行测试例程序
- in terminal1:
-
- cmd流程:
- images get
- create container based images with config(eg:ipc/uts/pid/network)
- run container
- copy file to images from host
- config env/ssh and so on
- run binary executable file
- over test
- eg:
docker ps -a sudo docker container commit CONTAINER_ID images_name:v1.0 sudo docker import tar_name.tar images_name:v1.0 docker load < tar_name.tar - or edit Dockerfile to build docker images docker run -it --ipc=shareable --name container_name images_id /bin/bash - cmd or bash/shell or executable binary docker export container_id > tar_name.tar docker save images_id > tar_name.tar
4.example list:
-
docker import
&&docker images
:
-
docker run
&&docker ps -a
:
-
docker start
/docker attach
:
-
docker cp
:
host:
docker:
-
eg to test develop-app:
docker:
host:
-
exit
&&docker export
&&docker rm
&&docker rmi
:
-
waiting for update......