Docker的基本使用

avatar 2019年10月10日18:44:06 评论 910 次浏览

docker的基本使用主要记录docker在不管是生产环境还是测试环境中的使用和一些基本使用命令。

docker镜像下载

docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest

docker镜像修改现有镜像的标签

docker tag b2b03e9146e1 192.168.31.11:5000/registry:latest-20180802

docker 容器打包成镜像

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.2.1511            4cbf48630b46        2 weeks ago         195MB
docker commit nginx centos7_nginx/1.14.0:1.1.0000
sha256:ff95b2363312cd57e43910aa2ec5931914089de662c9dd6c8bc4cb32ad053da5
docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos7_nginx/1.14.0   1.1.0000            ff95b2363312        8 seconds ago       1.06GB
centos                 7.2.1511            4cbf48630b46        2 weeks ago         195MB
docker run -it  -v /home/www:/home/www -v /home/wwwlogs:/home/wwwlogs -v /home/wwwroot:/home/wwwroot -p 80:80 --name nginx1.0 0bca63fa07ed /bin/bash

1、先启动一下docker,在下载镜像

systemctl start  docker.service
docker pull centos:7.2.1511      #下载centos镜像
7.2.1511: Pulling from library/centos
a8c7037c15e9: Pull complete 
Digest: sha256:28f14903e337f2c897aa74e8c3c5ff38086849866a1a88b6554632e7d68c7c21
Status: Downloaded newer image for centos:7.2.1511
docker images       #查看镜像文件
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.2.1511            9aec5c5fe4ba        2 weeks ago         195MB

2、先创建一个容器,然后在进入容器

docker run --name centos-mast -it  centos:7.2.1511 /bin/bash
docker run 参数:
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用;     //相当于在本地添加了一个系统
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    --name="nginx-lb": 为容器指定一个名称;
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    -h "mars": 指定容器的hostname;
    -e username="ritchie": 设置环境变量;
    --env-file=[]: 从指定文件读入环境变量;
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    -m :设置容器使用内存最大值;
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    --link=[]: 添加链接到另一个容器;
    --expose=[]: 开放一个端口或一组端口;

3、容器创建之后如果关闭了,需要启动一下

docker start d26f95f7a059
docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d26f95f7a059        centos:7.2.1511     "/bin/bash"         10 minutes ago      Up About a minute                       centos-mast

这里是查看容器的启动状态,ps只是查看已经启动的容器,-a是所有容器的 这里我们关闭一个容器,然后在开启一个容器,用ps和-a来区别 docker container ls和docker ps -a是一个意思

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
15e751674ce2        centos:7.2.1511     "/bin/bash"         9 seconds ago        Exited (0) 4 seconds ago                       centos-test
799156d56e78        centos:7.2.1511     "/bin/bash"         About a minute ago   Up About a minute                              centos-master
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
799156d56e78        centos:7.2.1511     "/bin/bash"         About a minute ago   Up About a minute                       centos-master

NAMES的centos-test没有启动所以在docker ps的时候没有现实出来

4、进入容器中的四种方式: 第一种是使用shh登录,这个后面会详细说明 第二种是attach

docker attach ea03a67c8ede
[root@ea03a67c8ede /]# exit

第三种使用exec登录

docker exec -it 799156d56e78 /bin/bash
[root@799156d56e78 /]# exit
exit

第四种使用nsenter,需要先安装nsenter

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
$ tar -xzvf util-linux-2.24.tar.gz  
$ cd util-linux-2.24/  
$ ./configure --without-ncurses  
$ make nsenter  
$ sudo cp nsenter /usr/local/bin

安装nsenter之后可以使用docker inspect 第一种获取容器进程的方法

docker inspect 799156d56e78      #找到pid的进程
..............................
      "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 25083,           #############pid
            "ExitCode": 0,
            "Error": "",
..............................

第二种获取容器的方法

docker inspect -f {{.State.Pid}} 799156d56e78 
25083

通过进程PID使用nsenter命令访问该容器

nsenter --target 25083 --mount --uts --ipc --net --pid

5、删除容器 首先在删除容器之前需要看一下容器是否启动,如果启动的容器需要先停止容器在删除

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
15e751674ce2        centos:7.2.1511     "/bin/bash"         32 minutes ago      Exited (0) 32 minutes ago                       centos-test
799156d56e78        centos:7.2.1511     "/bin/bash"         34 minutes ago      Up 33 minutes                                   centos-master

这里有两个容器,我们就把master-test先启动一下,

docker start 15e751674ce2     #这里启动有多种方法,也可以使用NAMES
15e751674ce2
docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
15e751674ce2        centos:7.2.1511     "/bin/bash"         35 minutes ago      Up 4 seconds                            centos-test
799156d56e78        centos:7.2.1511     "/bin/bash"         37 minutes ago      Up 37 minutes                           centos-master

删除容器

docker rm -f 15e751674ce2
15e751674ce2
docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
799156d56e78        centos:7.2.1511     "/bin/bash"         38 minutes ago      Up 38 minutes                           centos-master

删除镜像,在删除镜像之前需要把关于镜像的容器都删除之后才可以删除镜像。删除镜像

docker rmi 9aec5c5fe4ba

6、容器导入导出 export 和improt export导出容器

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
c2e926fb6280        centos:7.2.1511     "/bin/bash"         38 seconds ago       Up 20 seconds                           centos-master
7bb443f8242d        centos:7.2.1511     "/bin/bash"         About a minute ago   Up 53 seconds                           centos-test
docker export c2e926fb6280 > master.tar    #导出docker容器
docker stop c2e926fb6280         #停止容器
c2e926fb6280
docker rm -f c2e926fb6280         #删除导出的容器
c2e926fb6280
docker ps -a                   #查看一下所有的容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7bb443f8242d        centos:7.2.1511     "/bin/bash"         2 minutes ago       Up About a minute                       centos-test
ls
anaconda-ks.cfg  master.tar

容器已经删除了,下面导入一下看看和导出的容器有什么不一样。 save导出容器

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7bb443f8242d        centos:7.2.1511     "/bin/bash"         19 minutes ago      Up 18 minutes                           centos-test
docker save -o test.tar centos:7.2.1511
ls
anaconda-ks.cfg  master.tar  test.tar

使用import导入

docker load <  master.tar  #使用export导出的容器不能使用load导入
open /var/lib/docker/tmp/docker-import-809953529/dev/json: no such file or directory

这就是docker load 和docker import 的区别。因为压缩包如果是用docker save打包的,自然可以用docker load,但是如果压缩包是用docker export打包的,那就需要用docker import。命令如下:

cat master.tar | docker import -  master
sha256:84ddb755c56912acd667a7ea38fa28ef0ef1f25bc1620c5e633583a20357bcc5

或者

docker import - master:7.2.1512 < master.tar 
sha256:05946cc630b0a854008cfe8d6da84304266d15ea3967e4e5677c5bb1e3ee1420
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
master              7.2.1512            05946cc630b0        2 seconds ago       195MB
master              latest              bcc76bba78b5        4 minutes ago       195MB
centos              7.2.1511            9aec5c5fe4ba        2 weeks ago         195MB

load导入

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
master              latest              bcc76bba78b5        16 minutes ago      195MB
centos              7.2.1511            9aec5c5fe4ba        2 weeks ago         195MB
docker rmi  9aec5c5fe4ba 
Untagged: centos:7.2.1511
Untagged: centos@sha256:28f14903e337f2c897aa74e8c3c5ff38086849866a1a88b6554632e7d68c7c21
Deleted: sha256:9aec5c5fe4ba9cf7a8d2a50713dd197c3b0cbd5f5fcd03babe4c1d65c455dabf
Deleted: sha256:a11c91bfd8669f0c82d437f0604d44080c7fa2ccda06d0fa2ba75275c9be4b3b
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
master              latest              bcc76bba78b5        16 minutes ago      195MB
docker load -i test.tar 
a11c91bfd866: Loading layer [==================================================>]    202MB/202MB
Loaded image: centos:7.2.1511
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
master              latest              bcc76bba78b5        16 minutes ago      195MB
centos              7.2.1511            9aec5c5fe4ba        2 weeks ago         195MB

这里注意一下使用export导出的容器需要使用docker import导入,使用docker save导出的使用load导入。所有导入的容器都会生成新的镜像,可以使用镜像直接生成新的容器即可完成恢复。 Dockerfile

mkdir docker_file
cd docker_file/
vi Dockerfile 
cat Dockerfile 
FROM ubuntu:14.04
ENTRYPOINT ["/bin/echo"]
[root@#localhost docker_file]# docker build 
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu:14.04
 ---> 7c09e61e9035
Step 2/2 : ENTRYPOINT /bin/echo
 ---> Running in d53f31b93355
 ---> 26dd06d2e5a5
Removing intermediate container d53f31b93355
Successfully built 26dd06d2e5a5
#运行镜像

docker文件copy

本地文件copy到容器中使用cp命令

docker cp 12345:/usr/local/log.txt /usr/local/

上面是从容器中copy到本地,如果从本地copy到容器中替换一下位置即可。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: