Docker入门系列(一)

0.三个基本概念

镜像(image):相当于一个root文件系统;
容器(container):镜像和容器的关系,就相当于面向程序设计的类和实例一样,镜像是静态的定义,容器是镜像运行的实体,容器可以被创建、启动、停止、删除、暂停等;
仓库(repository):仓库可以看做是一个代码控制中心,用于保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器, 容器通过 Docker 镜像来创建。

1.docker安装

创建一个shell脚本,例如叫install_docker.sh

sh install_docker.sh

等待命令跑完,验证docker是否安装好即可。直接敲docker + 回车。

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates 
curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io

2.Ubuntu Docker

Docker启动、重启、关闭命令:

启动             systemctl start docker
守护进程重启      sudo systemctl daemon-reload
重启docker服务   systemctl restart  docker
重启docker服务   sudo service docker restart
关闭             docker service docker stop
关闭             docker systemctl stop docker

3.常用命令

 1.查看当前运行容器状态
  sudo docker ps
  
 2.查看所有镜像
  docker images     
  查看所有的容器
  sudo docker ps -a
  
 3.启动某个已经停止的容器
   docker start <容器ID>
   
 4.停止运行容器
   docker stop <容器ID> 
   
 5.删除镜像/容器
   docker image rm <镜像ID>
   docker rm -f <容器ID>  #强制移除正在运行的容器(使用SIGKILL)
   
 6.导出容器/镜像
   docker export <容器ID> > ubuntu.tar
   sudo docker save -o mysql_20171108.tar ggk-mysql:5.6.33
 
 7.提交容器为镜像
   docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
   OPTIONS说明:
	-a :提交的镜像作者;
	-c :使用Dockerfile指令来创建镜像;
	-m :提交时的说明文字;
	-p :在commit时,将容器暂停。
	docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
 
 8.导入容器
   使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
   cat ubuntu.tar | docker import - test/ubuntu:v1 
   
   也可以通过指定 URL 或者某个目录来导入,例如:
   docker import http://example.com/exampleimage.tgz example/imagerepo
 
 9.运行容器
    如果使用的镜像本地中不存在,docker 就会自动从 docker 镜像仓库中下载(默认Docker Hub 公共镜像源)
    docker pull ubuntu:13.10    #下载指定镜像ubuntu:13.10
    docker run -t -i ubuntu:15.10 /bin/bash 
    docker run -ti --name <命名,如无docker会自动命名> <镜像源,本地不存在则自动拉取> <执行命令,如/bin/bash>
    -i: 交互式操作
    -t: 终端
    --name 命名(如无,docker会自动命名)
    ubuntu:15.10: 用 ubuntu 15.10 版本镜像为基础来启动容器。
    /bin/bash:放在镜像名后的是命令,这里希望有个交互式 Shell,因此用的是 /bin/bash。

SIZE:镜像大小
    后台运行容器
    docker run -itd ubuntu:16.04 /bin/bash
    -d 后台运行,默认不会进入容器
    
 10.进入一个正在运行的容器的终端
    docker attach <容器ID>
    注意输入exit后,会终止该容器的运行        
    docker exec -it <容器ID> /bin/bash
    注意输入exit后,不会终止该容器的运行
    
 11.从正在运行的 Docker 容器里面,将文件拷贝到本机	
	docker container cp [containID]:[/path/to/file] .

4.更新某个镜像

docker run -t -i ubuntu:15.10 /bin/bash #进入指定容器终端
apt-get update #修改容器(更新操作)  	 
docker commit -m="提交信息" -a="指定镜像作者" <容器ID> ubuntu15.10:v2<目标镜像名>

5.从零开始构建一个镜像

①创建Dockerfile文件,示例:

FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

②执行docker build命令创建镜像

docker build -t runoob/centos:6.7 <Dockerfile文件所在目录,.表示当前目录>
-t 指定要创建的目标镜像名(runoob/centos:6.7)

启动制作好的镜像:

docker run -d mygcc-test:v1 #启动镜像
docker ps  #查看容器的运行情况

目录路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
③添加新标签

docker tag acb8d9467fca new/centos:dev

ID为acb8d9467fca的镜像多一个标签,结果如下:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
new/centos          6.7                 acb8d9467fca        13 minutes ago      191MB
new/centos          dev                 acb8d9467fca        13 minutes ago      191MB

修改了tag后的镜像若要删除,docker rmi后面不能用镜像ID了,需要用docker rmi new/centos:dev 否则这两个都会删除
相关指令解析:
①FROM:镜像源
②RUN:在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件,有两种格式:
(CMD命令则是在容器启动后执行)
shell格式:

RUN <命令行命令,终端操作>

exec格式:

RUN [“可执行文件”,“参数1”,“参数2”]
RUN ["./test.php", "dev", "offline"]

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层,容易造成镜像膨胀过大,推荐格式:

RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

③COPY:从本地目录中复制文件到容器指定目录

COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
[--chown=<user>:<group>] #可选参数,用户改变复制到容器内文件的拥有者和属组

④ENV:设置环境变量,设置完后,在后续指令中可以使用这个环境变量

ENV <key1>=<value1> <key2>=<value2>...
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
 && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

⑤ARG:与 ENV 作用一样,不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效
⑥VOLUME:定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 避免重要的数据,因容器重启而丢失,这是非常致命的,避免容器不断变大。

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

⑦CMD和ENTRYPOINT区别
CMD是容器启动后默认执行的指令。如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,则执行默认CMD指令;如果docker run指定了命令或有ENTRYPOINT,则CMD命令被覆盖。
一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

ENTRYPOINT是真正用于定义容器启动以后的执行体

An ENTRYPOINT allows you to configure a container that will run as an executable.
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)#推荐
ENTRYPOINT command param1 param2 (shell form)

总结:
①一般还是会用ENTRYPOINT的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分;
②可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。
③如果想用默认参数,就直接run;想用其他参数,就run 里面加参数

6.通过网络端口来访问运行在 docker 容器内的服务

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射指定容器的绑定网络地址,如通过访问 127.0.0.1:5001 来访问容器的 5000 端口,示例:

docker run -d -P training/webapp python app.py #创建一个 python 应用的容器
docker run -d -p 5000:5000 training/webapp python app.py	#指定端口
-P :是容器内部端口随机映射到主机的端口
-p :是容器内部端口绑定到指定的主机端口
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py#指定绑定的网络地址,如绑定127.0.0.1

上面的例子默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看端口的绑定情况

 docker port 88fe54189c7a

7.容器互联

端口映射并不是唯一把 docker 连接到另一个容器的方法,docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
①创建docker网络

docker network create -d bridge <网络名test-net > #查看 docker network ls
-d:参数指定 Docker 网络类型,有 bridge、overlay,其中 overlay 网络类型用于 Swarm mode

②开两个终端分别运行两个容器,并连接到新创建的网络上

docker run -it --name <容器名> --network <网络名> <镜像源> /bin/bash

③ping来查看连接情况

docker exec -it <docker_1> /bin/bash  # 进入docker_1终端
# ping docker_2  # ping一下docker_2

如果有多个容器之间需要互相连接,推荐使用 Docker Compose
(可能要安装一下ping指令,容器终端里执行如下命令)

 apt-get install -yqq inetutils-ping

8. docker compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,则效率很低下。使用 YML 文件来配置应用程序需要的所有服务,就可以从 YML 文件配置中创建并启动所有服务。
示例软件是 WordPress参考教学链接,它是一个常用软件,结构比较简单,只要两个容器就够了(业务容器 + 数据库容器),这种"业务 + 数据库"的容器架构,具有通用性,许多应用程序都可以复用。

 docker-compose up     # 启动所有服务
 docker-compose stop   # 关闭所有服务
 docker-compose rm     # 删除容器(必须关闭后)

yml文件的写法:

mysql:
image: mysql:5.7
environment:
 - MYSQL_ROOT_PASSWORD=123456
 - MYSQL_DATABASE=wordpress
web:
image: wordpress
links:
 - mysql
environment:
 - WORDPRESS_DB_PASSWORD=123456
ports:
 - "127.0.0.3:8080:80"
working_dir: /var/www/html
volumes:
 - wordpress:/var/www/html

9.发布一个c++程序案例

Dockerfile文件

FROM gcc:latest

WORKDIR /usr/src/myapp

COPY test.cpp /usr/src/myapp

RUN  g++ test.cpp  -lstdc++ -o test

CMD ["./test"]

docker-compose.yml

version : '2.2'           #Compose文件版本支持特定的Docker版本
services:                 #本工程的服务配置列表
   g_plusplus:            #spring boot的服务名,服务名自定义
     container_name: c_plusplus   #指定容器实例的名字,不指定,容器命名规则是[compose文件所在目录]_[服务名]_1
     image: gcc:to_c_plusplus1   #依赖镜像

test.cpp

#include <string>
#include <iostream>
#include <fstream>
#include <unistd.h>

using namespace std;

int main()
{
    ofstream os;
    os.open("t.txt");
    if (!os){
        return 0;
    }
    int num = 0;
    string buf;
    while(1){
        buf = "hello world!!!" + to_string(++num);
        os<<buf;
        cout<<buf<<endl;
        sleep(1);
    }
    os.close();
    return 0;
}

①根据gcc:latest创建镜像 gcc:to_c_plusplus

docker build -t gcc:to_c_plusplus .

②使用docker compose创建并启动c++微服务

docker-compose up

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值