目录

安装

配置国内加速

Docker容器三个主要概念:仓库、镜像和容器

简单流程

镜像

容器

常用镜像安装:mysql、nginx、redis

拉取镜像

创建目录和配置文件

启动容器

运行docker 容器Permission denied


安装

环境: Centos7

安装yum-utils
yum install -y yum-utils

查看是否已安装docker列表
yum list installed | grep docker

安装docker
yum -y install docker

-y表示不询问安装,直到安装成功,安装完后再次查看安装列表

 

mysql镜像端口映射 mysql镜像启动_nginx

  • 启动docker      systemctl start docker
  • 查看docker服务状态    systemctl status docker
  • 停止   systemctl stop docker
  • 重启   systemctl restart docker
  • 设置开机启动   systemctl enable docker.service

 

mysql镜像端口映射 mysql镜像启动_docker_02

配置国内加速

vi /etc/docker/daemon.json

{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "live-restore": true
}

Docker容器三个主要概念:仓库、镜像和容器

  • 镜像: 相当于程序安装包
  • 容器: 安装好的程序
  • (镜像的)仓库: 放安装包的仓库.
  • 镜像
    Docker镜像里包含了已打包的应用程序及其所依赖的环境。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
  • 镜像仓库
    Docker镜像仓库用于存放Docker镜像,以及促进不同人和不同电脑之间共享这些镜像。当编译镜像时,要么可以在编译它的电脑上运行,要么可以先上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。某些仓库是公开的,允许所有人从中拉取镜像,同时也有一些是私有的,仅部分人和机器可接入。
  • 容器
    Docker容器通常是一个Linux容器,它基于Docker镜像被创建。一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)。

简单流程

首先开发者在开发环境机器上开发应用并制作镜像。构建镜像并存储在机器上。然后将本地镜像上传到镜像仓库。生产环境机器收到运行镜像命令后,Docker会从镜像仓库拉取镜像到机器上,然后基于镜像运行容器。

镜像

  • 查看镜像   docker images
  • 搜索镜像   docker search 镜像名称
  • 拉取镜像   docker pull 镜像名称:版本号
  • 删除镜像   docker rmi 镜像名称:版本号
  • 镜像信息   vi /var/lib/docker/image/devicemapper/repositories.json

容器

  • 查看所有容器   docker ps -a
  • 查看正在运行的容器  docker ps
  • 启动容器   docker start 容器名称 
  • 停止容器   docker stop 容器名称
  • 重启容器   docker restart nginx
  • 当你使用Docker运行Nginx并挂载了配置文件,然后修改了这些挂载的配置文件后,仅仅重启Docker容器是不够的,Nginx服务本身也需要重新加载或重启。
  • 如nginx:docker exec -it <container_name_or_id> nginx -s reload
  • docker exec -it nginx nginx -s reload
  • 删除容器   docker rm 容器名称
  • 删除所有容器   docker rm `docker ps -aq`
  • 查看容器详细信息   docker inspect 容器名称
  • 容器文件位置   cd /var/lib/docker/containers/
  • 创建容器(参数详解)   docker run --name nginx -p 80:80 -d nginx
  • 进入容器:docker exec -it nginx bash
  • 容器内vi、vim失效:apt-get update     apt-get install vim
  • ps -aux|grep nginx失效:      apt-get update && apt-get install procps
  • 退出容器:exit
  • 获取容器的日志: docker logs f813e52ce6ec650ca7fb9992a
  • -f : 跟踪日志输出
  • --since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • --tail :仅列出最新N条容器日志

常用镜像安装:mysql、nginx、redis

拉取镜像

docker pull nginx
docker pull redis
docker pull kdvolder/jdk8
docker pull mysql:5.7

创建目录和配置文件

cd /server/
mkdir jar  
mkdir logs
mkdir file

 

mysql镜像端口映射 mysql镜像启动_mysql镜像端口映射_03

/server/file目录下创建文件redis.conf,内容如下:

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

如果bind设置为 127.0.0.1,则只能本机访问

/server/file目录下创建文件nginx.conf,和conf.d目录,/server/www(放html文件)

  

mysql镜像端口映射 mysql镜像启动_centos_04

mysql镜像端口映射 mysql镜像启动_centos_05

user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
    #gzip  on;
 
    include /etc/nginx/conf.d/*.conf;
}

conf.d目录下灵活放入多个nginx配置,/server/file/conf.d下创建default.conf

server {
    listen       80;
    server_name  localhost;
  
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
  
    location / {  
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        #autoindex  on;
        #try_files $uri /index/index/page.html;
        #try_files $uri /index/map/page.html;
    }  
  
    #error_page  404              /404.html;
  
    # redirect server error pages to the static page /50x.html
    #  
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
  
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #  
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}  
  
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
    #  
    #location ~ \.php$ {  
    #    root           html;  
    #    fastcgi_pass   127.0.0.1:9000;  
    #    fastcgi_index  index.php;  
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
    #    include        fastcgi_params;  
    #}  
  
    # deny access to .htaccess files, if Apache's document root  
    # concurs with nginx's one  
    #  
    #location ~ /\.ht {  
    #    deny  all;  
    #}  
}

启动容器

启动Mysql容器

docker run -p 3316:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

  

mysql镜像端口映射 mysql镜像启动_centos_06

创建运行nginx容器

docker run --name nginx -p 80:80 -v /server/www:/usr/share/nginx/html \
-v /server/file/nginx.conf:/etc/nginx/nginx.conf \
-v /server/logs/nginx:/var/log/nginx \
-v /server/file/conf.d:/etc/nginx/conf.d -d nginx:latest
  • \是换行的意思
  • --name nginx  为容器指定一个名称
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口,可以使用多个-p做多个端口映射(-p 5000:23 -p 5001:22)
  • -d: 后台运行容器,并返回容器ID;
  • -v   将宿主机目录挂载到容器的目录,-v /宿主机目录:/容器目录
  • /server/www目录上传一个测试html,访问:

创建运行redis容器

docker run --privileged=true -p 6378:6379 \
-v /server/file/redis.conf:/docker/redis/conf/redis.conf \
-v /server/file/redis_data:/docker/redis/data --name redis \
-d redis:latest redis-server /docker/redis/conf/redis.conf --appendonly yes --requirepass 'pwredis456'
  • -d  后台运行容器,并返回容器ID;
  • --privileged=true 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
  • -p 6378:6379 指定端口映射,格式:主机(宿主)端口:容器端口
  • --name redis 指定一个名称
  • redis:latest redis-server /docker/redis/conf/redis.conf 指定配置文件启动redis-server进程,latest镜像版本,docker images查看
  • --appendonly yes 开启数据持久化
  • --requirepass '123456’设置密码

常见问题

运行docker 容器Permission denied

因为linux为了系统安全性,会控制用户可以访问、读取、修改哪些文件,通过selinux限制了该文件得写入权限。

Selinux有3种选项,分别为:

  • enforcing:强制模式,违反SELinux规则的行为将被阻止并记录到日志中。
  • permissive:宽容模式,违反SELinux规则的行为只会记录到日志中,一般为调试用。
  • disabled:关闭 SELinux。

临时关闭

  • [root@localhost ~]# getenforce
  • Enforcing
  • [root@localhost ~]# setenforce 0
  • [root@localhost ~]# getenforce
  • Permissive

永久关闭:需重启服务器

  • [root@localhost ~]# vim /etc/sysconfig/selinux
  • SELINUX=enforcing 改为 SELINUX=disabled

mysql镜像端口映射 mysql镜像启动_linux_07

运行docker 容器失败

刚启动就关闭的, 可docker logs (id)查看报错日志解决, 一般是配置文件写错了