码迷,mamicode.com
首页 > 其他好文 > 详细

docker基本操作

时间:2018-10-30 13:14:56      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:hub   data   手动   str   hosts   基本使用   访问控制   ups   min   

docker的基本操作链接

docker安装

apt-get remove docker docker-engine docker.io # 旧版本卸载

apt-get update

apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual # ubuntu14.04的可选内核安装16.04以上不用 存储层驱动安装

  • apt源使用https添加软件包与CA证书

    $ sudo apt-get update
    
    $ sudo apt-get install    apt-transport-https    ca-certificates    curl    software-properties-common

    国内源docker

    $ sudo add-apt-repository    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu    $(lsb_release -cs)    stable"

    更新 apt 软件包缓存,并安装 docker-ce

    $ sudo apt-get update
    
    $ sudo apt-get install docker-ce

    docker ce启动

    $ sudo systemctl enable docker # 开机启动
    $ sudo systemctl start docker
    
    $ sudo service docker start # ubuntu14启动命令

    建立 docker 组:

    $ sudo groupadd docker

    将当前用户加入 docker 组:

    $ sudo usermod -aG docker $USER
  • docker镜像获取:官网与配置国内镜像加速

    我们以 Docker 官方加速器 https://registry.docker-cn.com 为例进行介绍。

    Ubuntu 14.04、Debian 7 Wheezy

    对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:

    DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

    重新启动服务。

    $ sudo service docker restart

    Ubuntu 16.04+、Debian 8+、CentOS 7

    对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

    {
      "registry-mirrors": [
        "https://registry.docker-cn.com"
      ]
    }

    之后重新启动服务。

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker

    注意:如果您之前查看旧教程,修改了 docker.service 文件内容,请去掉您添加的内容(--registry-mirror=https://registry.docker-cn.com),这里不再赘述。

    这个是我在QQ上下载的文件以国内阿里云为例不错的下载速度

docker基本使用

  • 镜像查找

    docker search LAMP

    --filter=stars=N 参数可以指定仅显示收藏数量为 N 以上的镜像。

  • 获取镜像

    从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
    $ docker pull ubuntu:16.04

    具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

    • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
    • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
  • 镜像运行

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

    可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

    可以利用 docker run --help 命令,直接将一个实例化一个镜像启动运行。(ctrl+p,ctrl+q切换到后台不是exit退出容器)

    可以利用 docker run -d --name name -p.... 命令,守护进程启动

    终止状态的容器可以用 docker container ls -a 命令看到。

    j进入后台运行的容器docker exec -it 69d1 bash

    docker container stop 来终止一个运行中的容器

    $ docker run -it --rm ubuntu:16.04 bash  # 在exit下推出会删除镜像运行的容器,保存在临时的存储层数据不可修复
    $ docker image ls  #列出已经下载的镜像
    $ docker system df  # 使用的实际大小
    $ docker image rm [选项] <镜像1> [<镜像2> ...]  # 镜像的删除,有untaged,delete,untaged不会删除镜像多层文件结构(因为如果有其他的后来commit的镜像引用的话)

    命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

    $ docker run --name webserver -d -p 80:80 nginx  # 后台运行镜像,容器为镜像+外部存储层,指定名称
    $ docker exec -it webserver bash # 交互式进入后台镜像
    root@3729b97e8226:/# echo ‘<h1>Hello, Docker!</h1>‘ > /usr/share/nginx/html/index.html
    root@3729b97e8226:/# exit  # 并不会删除容器的进程
    exit
    $ docker diff webserver  # 查看对镜像做出的改动
    # 现在我们定制好了变化,我们希望能将其保存下来形成镜像
    docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]  # 保存现场
    $ docker commit     --author "Tao Wang <twang2218@gmail.com>"     --message "修改了默认网页"     webserver \  # 指定源容器模板
        nginx:v2  # 指定保存名称
    $ docker run --name web2 -d -p 81:80 nginx:v2
    
    

    如果要导出本地某个容器,可以使用 docker export 命令。

    $ docker container ls -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
    7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
    $ docker export 7691a814370e > ubuntu.tar

    可以使用 docker import 从容器快照文件中再导入为镜像,例如

    $ cat ubuntu.tar | docker import - test/ubuntu:v1.0
    $ docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

保存镜像运行时的文件不再是临时存储层数据卷的使用

  • 数据挂载
  • 主机目录挂载

    ### 创建一个数据卷

    $ docker volume create my-vol

    查看所有的 数据卷

    $ docker volume ls
    local               my-vol

    在主机里使用以下命令可以查看指定 数据卷 的信息

    $ docker volume inspect my-vol
    [
        {
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
            "Name": "my-vol",
            "Options": {},
            "Scope": "local"
        }
    ]

    ### 启动一个挂载数据卷的容器

    在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷

    下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。

    $ docker run -d -P     --name web     # -v my-vol:/wepapp     --mount source=my-vol,target=/webapp     training/webapp     python app.py

    ### 查看数据卷的具体信息

    $ docker inspect web

    ### 删除数据卷

    $ docker volume rm my-vol

    ### 挂载一个主机目录作为数据卷

    使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。

    $ docker run -d -P     --name web     # -v /src/webapp:/opt/webapp     --mount type=bind,source=/src/webapp,target=/opt/webapp     training/webapp     python app.py

    上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

    Docker 挂载主机目录的默认权限是 读写,用户也可以通过增加 readonly 指定为 只读

    $ docker run -d -P     --name web     # -v /src/webapp:/opt/webapp:ro     --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly     training/webapp     python app.py

    加了 readonly 之后,就挂载为 只读 了。如果你在容器内 /opt/webapp 目录新建文件,会显示如下错误

    /opt/webapp # touch new.txt
    touch: new.txt: Read-only file system

docker网络使用

  • 外部访问docker容器

    • 映射所有接口地址(接口可以理解为ip,网卡这些)
    • 映射到指定地址的指定端口
    • 映射到指定地址的任意端口
    • 查看映射端口配置
  • 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。

    当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

    使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。

    $ docker run -d -P training/webapp python app.py
    
    $ docker container ls -l
    CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
    bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  

    -p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  • 映射所有接口地址

    使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行

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

    此时默认会绑定本地所有接口上的所有地址。

    映射到指定地址的指定端口

    可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

    $ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  • 查看映射端口配置

    使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

    $ docker port nostalgic_morse 5000
    127.0.0.1:49155.

    注意:

    • 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
    • -p 标记可以多次使用来绑定多个端口

    例如

    $ docker run -d     -p 5000:5000     -p 3000:80     training/webapp     python app.py
  • docker容器之间的通信:容器互联

    下面先创建一个新的 Docker 网络。(高级使用docker compose)

    $ docker network create -d bridge my-net

    -d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

    运行一个容器并连接到新建的 my-net 网络

    $ docker run -it --rm --name busybox1 --network my-net busybox sh

    打开新的终端,再运行一个容器并加入到 my-net 网络

    $ docker run -it --rm --name busybox2 --network my-net busybox sh

    下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。

    busybox1 容器输入以下命令

    / # ping busybox2
    PING busybox2 (172.19.0.3): 56 data bytes
    64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
    64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

    配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。

    {
      "dns" : [
        "114.114.114.114",
        "8.8.8.8"
      ]
    }

    这样每次启动的容器 DNS 自动配置为 114.114.114.1148.8.8.8。使用以下命令来证明其已经生效。

    容器访问控制

    容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptables 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。

    容器访问外部网络

    容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。

    $sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1

    如果为 0,说明没有开启转发,则需要手动打开。

    $sysctl -w net.ipv4.ip_forward=1

    访问所有端口

    当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(ACCEPT)还是禁止(DROP)取决于配置--icc=true(缺省值)还是 --icc=false。当然,如果手动指定 --iptables=false 则不会添加 iptables 规则。

    可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在 /etc/default/docker 文件中配置 DOCKER_OPTS=--icc=false 来禁止它。

常用命令

docker run -dit ubuntu
docker run -dit -p 10000:80 -name web lamp #后台运行
docker container ls # 列出正在运行的容器
dokcer exec -it container_name bash # 交互式运行终端
docker container ls -a  # 列出所有的容器
docker container stop container_name 
docker container start container_name # 启动一个已经停止了的容器
docker container rm  trusting_newton # 删除一个容器

# 绑定目录
$ docker run -d -P     --name web     # -v /src/webapp:/opt/webapp     --mount type=bind,source=/src/webapp,target=/opt/webapp     training/webapp     python app.py
    
 # 数据卷
 docker volume create my-vol
 docker volume rm my-vol
 docker volume ls
 $ docker run -d -P     --name web     # -v my-vol:/wepapp     --mount source=my-vol,target=/webapp     training/webapp     python app.py
    
    
 # 外部容器访问
 docker run -d -P training/webapp python app.py # 随机
 docker container ls -l # 看详细信息
 docker run -d -p 5000:5000 training/webapp python app.py
 docker run -d     -p 5000:5000     -p 3000:80     training/webapp     python app.py
    
# 容器互联 网桥统一网段
 docker network create -d bridge my-net
 docker run -it --rm --name busybox1 --network my-net busybox sh
 docker run -it --rm --name busybox2 --network my-net busybox sh
 
# 镜像管理
docker image ls
docker image re  name|id
docker image rm 501

docker run -p 8000:8000 -it ctfd/ctfd`
docker inspect 5506de2b643b  # 看信息
 sudo docker run --name mysql -d --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql_data:/var/lib/mysql mysql/mysql-server
 
# 没有映射的端口是不能够访问的 10000我修改的两个vitualHost
sudo docker run -p 80:80 -p 3306:3306 -v /your/path/www:/var/www -v /your/path/apache2.conf:/etc/apache2/apache2.conf -v /your/path/my.cnf:/etc/mysql/my.cnf -t -i linode/lamp /bin/bash
#解释:
docker run:运行一个container,如果后面要绑定宿主主机的0-1024端口需要使用sudo
-p port1:port2: 将宿主机的端口port1映射到容器中的port2
-v file1:file2: 将宿主机的文件\路径挂载到容器中的文件\路径
-t -i linode/lamp /bin/bash:使用linode/lamp生成容器,并打开shell


# 虚拟机遇到的问题
1.docker run -p 80:80 -p 10000:10000 --mount type=bind source=/var/tmp/docker/www,target=/var/www/html -dit --name test linode/lamp  # 绑定本机的文件夹或者文件,没有映射的端口本机是不能够访问的
2.数据库的密码与密码修改
以初始化的密码登入MySQL:mysql -uroot -p
use mysql;
mysql -uroot -p
#密码:Admin2015

#修改root可远程登录:
mysql>use mysql;
mysql>update user set host = ‘%‘ where user = ‘root‘ and host=‘127.0.0.1‘;

#修改密码:
mysql>update user set password=password("your_password");

#刷新权限
FLUSH PRIVILEGES;

root@3e5424b63b00:/var/www/html# mysql -uroot -pThonsun123@

3.apache2的使用在Ubuntu14.04下:service apache2 start|retstart|status,刚开的容器是没有开启apache2服务的,要手动开启,否则主机访问不了它的网站,
Apache的配置文档的修改很重要,一些安全措施
4.https://hub.docker.com/r/linode/lamp/ 这个镜像的官方文档
5.
root@kali:/home/kali# docker run -dit --mount type=bind,source=/var/tmp/docker/www/,target=/var/www/ -p 81:80 -p 10001:10000 --name ctf ctf:v1 bash
cd9101a6dc094c0cec7066d557336bb1ca8a0427abcaa75e075f8a01087dc0c6
root@kali:/home/kali# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                    NAMES
cd9101a6dc09        ctf:v1              "bash"              11 seconds ago      Up 9 seconds        3306/tcp, 0.0.0.0:81->80/tcp, 0.0.0.0:10001->10000/tcp   ctf
3e5424b63b00        linode/lamp         "bash"              3 hours ago         Up 3 hours          0.0.0.0:89->80/tcp, 0.0.0.0:10000->3306/tcp              test
root@kali:/home/kali# 


# 现在我们定制好了变化,我们希望能将其保存下来形成镜像
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]  # 保存现场
$ docker commit     --author "Tao Wang <twang2218@gmail.com>"     --message "修改了默认网页"     webserver \  # 指定源容器模板
    nginx:v2  # 指定保存名称
$ docker run --name web2 -d -p 81:80 nginx:v2

docker run -dit -p 82:80 -p 83:81 --mount type=bind,source=/var/tmp/docker/www,target=/var/www --name ctf1 ctf:v1 bash
docker container ls 
docker inspect name

参考Apache2配置文件使用

域控与DNS服务器

127.0.0.1 www.example.com 127.0.0.1 www.example.com # dns hosts文件修改 A hosts file will probably be located at /etc/hosts or C:\Windows\system32\drivers\etc\hosts.

总结Apache2 VitualHost的配置

基于不同端口的映射不同网站映射(docker主机的端口映射)

1.linode:lamp镜像的使用参考文档是要到hub中查阅 mysql code Admin2015

2.修改过的镜像生成 docker commit --author "thonsun" --message "your note" container_name lamp:ctf

3.apache2.conf配置文档采用include机制把全局配置,文件访问控制,虚拟机主机加载进来,在此我主要通过修改

# domain: example.com
# public: /var/www/example.com/public_html
Listen 81
#Listen 80会报错,可能在全局变量那配置了
#这里实现的是基于不同端口的访问,基于域名+主机/etc/hosts文件的DNS重定向的修改配置
<VirtualHost 172.17.0.4:81>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin webmaster@example.com
  ServerName  www.example.com
  ServerAlias example.com

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/example.com/public_html
  # Log file locations
  LogLevel warn
  ErrorLog  /var/www/example.com/log/error.log
  CustomLog /var/www/example.com/log/access.log combined
</VirtualHost>
<VirtualHost 172.17.0.4:80>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin webmaster@example.com
  ServerName  www.thonsun.com
  ServerAlias thonsun.com

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /var/www/html/
  # Log file locations
  LogLevel warn
  ErrorLog  /var/www/html/error.log
  CustomLog /var/www/html/access.log combined
</VirtualHost>

参考:

https://httpd.apache.org/docs/2.4/en/vhosts/examples.html 重要

https://www.cnblogs.com/ylan2009/archive/2012/02/25/2368028.html

Ubuntu 16.04+、Debian 8+、CentOS 7

Thonsun123@

thonsun123@

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

之后重新启动服务。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker tag ctf:v2 thonsun/lamp:16.04

docker image ls

docker push thonsun/lamp:16.04

$ docker cp file container-id:newfile  # 复制文件

docker基本操作

标签:hub   data   手动   str   hosts   基本使用   访问控制   ups   min   

原文地址:https://www.cnblogs.com/0xthonsun/p/9876107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!