1.docker概述
docker是一个实现容器技术的软件,依赖于 Linux 内核技术 chroot 、namespace 和 cgroup。
程序架构
docker是CS架构的软件,命令行敲的命令会发送到一个守护进程docker Daemon执行。一般地,命令行和守护进程在同一个计算机运行。容器,镜像的管理由docker Daemon执行,命令行无需关心。
核心概念
docker有三个核心概念,镜像,容器和仓库。
2.docker安装的简单方法
# 执行脚本简易安装(官方提供)
$ sudo apt-get install curl
$ curl -sSL https://get.daocloud.io/docker | sh
# 修改添加当前用户到docker用户组,修改socket权限
$ sudo usermod -aG docker 自己的用户名(这是一个用户)
$ sudo chmod 777 /var/run/docker.sock
# 退出终端后再次进入测试命令
$ docker --help
第一次运行可以 docker run hello-world来测试
卸载命令 :
apt-get remove docker
apt-get remove docker-ce
apt-get remove docker-ce
重点:
1 docker客户端 连接本机的docker服务端(daemon), 发送命令。
2 docker服务端 从 仓库中拉去 镜像。
3 docker服务端 运行镜像,用来创建一个容器,并 执行容器中的软件,软件输出数据到docker服务端。
4 docker服务端将输出的数据发送给 docker客户端, docker客户端把数据发送到终端显示。
仓库:
类似github,docker官方设定了一个docker镜像的仓库:仓库的官方网站 :https://hub.docker.com/
- 本地计算机可以拉去dockerhub上的镜像
# 完整的docker镜像名称是 作者/镜像名:标签, 拉取镜像不需要带作者名
$ docker pull ubuntu/ubuntu:latest
- 本地计算机的镜像可以推送到dockerhub的账户内
# 登陆,按照提示输入github的用户名密码
$ docker login
# 将本地镜像重命名成规范名称
$ docker tag ubuntu marklion/ubuntu:myfirsttag
# 推送自己的镜像
$ docker push marklion/ubuntu:myfirsttag
- 镜像的修改,提交等操作很类似git和github的操作。
镜像
- 概念: 一组环境的静态集合,类似操作系统镜像。
- 特点: docker镜像有分层依赖的关系。创建镜像的过程就好像写代码,从简单到复杂的过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6PfISZ0d-1590243586569)(G:\面试\分类总结\图片\镜像分层.png)]
- 运行: 镜像运行后会产生容器。基于一个镜像可以运行多个容器。
# 查看当前所有的镜像
$ docker images
# 运行ubuntu镜像:在ubuntu容器中执行一条ls的命令,不写命令则运行bash
$ docker run --rm -ti ubuntu ls
# --rm -ti参数:运行结束后删除容器,提供虚拟终端和交互式界面
-
进入:
$ docker run --rm -ti ubuntu bash 或者 $ docker run --rm -ti ubuntu
-
创建: 类似基于原始系统搭环境
-
手动创建
- 下载并运行基础镜像
- 进入基础镜像的容器内安装所需环境
- 将容器提交为镜像
# 直接执行ifconfig,报错,因为基础镜像没有安装ifconfig包 $ docker run --rm ubuntu ifconfig docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"ifconfig\": executable file not found in $PATH": unknown. ERRO[0000] error waiting for container: context canceled # 进入基础镜像,安装工具包后退出 $ docker run -ti ubuntu # apt-get update # apt-get install -y net-tools # exit # 找到刚才的容器,基于其创建镜像 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 034abada670c ubuntu "/bin/bash" 31 minutes ago Exited (0) 20 seconds ago zealous_swirles # commit命令用于容器---》镜像 # 容器ID可以用简写 $ docker commit 034a my_unbuntu:add_net $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE my_unbuntu add_net 6ca02b1d0483 5 seconds ago 114MB # 用新镜像运行ifconfig $ docker run --rm my_unbuntu:add_net ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 2 bytes 200 (200.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
-
脚本创建 (后面第 2.5 节 做更详细的介绍)
- 编写Dockerfile
- 运行docker编译命令
# Dockerfile中定义基础镜像,和要运行的安装命令 $ cat Dockerfile FROM ubuntu RUN apt-get update RUN apt-get install -y net-tools # 编译镜像,指定镜像名是df_unbutu:add_net,指定Dockerfile所在目录是当前目录 $ docker build -t df_unbutu:add_net .
小结: 手动创建方便操作,脚本创建方便分享。
查看所有镜像
docker images
删除镜像
docker rmi *镜像ID docker rmi *镜像名称
删除所有镜像:
docker rmi $(docker images -q)
-
3.ubuntu中修改docker镜像源简单方法
1.启动容器时,挂载本地Linux系统的etc/apt文件到容器中
docker run -ti -v /etc/apt/:/xxx ubuntu
2.进入容器/etc/apt目录下删除 sources.list文件
rm sources.list
3.将挂载文件夹下的sources.list文件拷贝过来
cp /apt/sources.list ./
4.使用docker编译部署c/c++程序
用docker部署c/c++程序,首先需要一个Linux的基础镜,可以是ubuntu、centos、alpine等。这里用alpine,而alpine最大的优点是体积小。
1.docker pull alpine //拉取镜像
2.docker images //查看一下镜像大小 大概5兆多
3.docker run -ti alpine
4.apk add vim //安装vim后写一个hello.c
5.apk add gcc
6.apk add libc-dev
7.gcc hello.c -o hello
8.运行./hello即可